Android屏幕横竖屏切换和生命周期管理的详细总结
一般的我们去切换屏幕方向都是不希望Activity被重新创建,这时就需要对一些属性进行设置,或者使用代码设置。
今天想学一下Android屏幕横竖屏切换,但是网上很多知识不准确或不正确,这里我还是自己总结一篇文章,供大家参考。
一.屏幕横竖屏切换的代码
很多文章一上来就将什么生命周期或者乱七八糟的,我认为你首先要会横竖屏切换啊!
(一)设置屏幕横屏代码
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
这个在Activity下可以直接使用
(二)设置屏幕竖屏的代码
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
(三)判断屏幕是横屏还是竖屏的状态
/**
*系统中定义: int ORIENTATION_PORTRAIT = 1; 竖屏
*系统中定义: int ORIENTATION_LANDSCAPE = 2; 横屏
*/
//获取屏幕的方向 ,数值1表示竖屏,数值2表示横屏
int screenNum = getResources().getConfiguration().orientation;
这里啰嗦一句:
PORTRAIT 翻译是肖像的意思,肖像一般都是竖直方向的吧
LANDSCAPE 翻译是景观的意思,景象一般是要横着看的吧,才能看得比较多
这是我对系统定义横竖屏字面的理解。
二.横竖屏切换Activity生命周期回调
我今天测试了一下,发现很多文章描述这里并不正确!
横竖屏属性设置可以在AndroidManifest.xml中设置
代码:
<activity android:name="MyActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait"
android:label="@string/app_name">
(一)configChanges属性
设置configChanges这个值就可以避免Activity生命周期被回调,下面是这个值的详细说明:
configChanges属性可以设置多个值,中间使用竖线分割;
1. orientation 屏幕在纵向和横向间旋转
2.keyboardHidden 键盘显示或隐藏
3.screenSize 屏幕大小改变了
4.fontScale 用户变更了首选的字体大小
5.locale 用户选择了不同的语言设定
6.keyboard 键盘类型变更,例如手机从12键盘切换到全键盘
7.touchscreen或navigation 键盘或导航方式变化,一般不会发生这样的事件
其中前面三个是常用的,后面的属性很少用!
如果要Activity中的生命周期不回调,就要设置:
android:configChanges="orientation|keyboardHidden|screenSize"
注意一定要设置这三个值,否是生命周期会被回掉。
这里我吐槽一下网上的文章,很多都是说设置了“orientation“和”keyboardHidden”属性就可以避免Activity生命周期的回调,其实不对。因为这是android很久以前版本的SDK才有效,我也是通过实验和看别人一些经验才知道的,很多文章没有提到这个“ScreenSize”属性,这也是近几年才出现的,但是也是要必须设置的,你不试过的话就不知道!
如果只设置”orientation|screenSize”,会发生竖屏变横屏生命周期会有先销毁后重新onCreate,如果是横屏变竖屏生命周期方法不会被回调!
(二)onConfigurationChanged方法
在Activity中可以重写这个方法:
//屏幕方向发生改变的回调方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
text_screen.append("\n 当前屏幕为横屏");
} else {
text_screen.append("\n 当前屏幕为竖屏");
}
super.onConfigurationChanged(newConfig);
Log.e("TAG", "onConfigurationChanged");
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //设置横屏
}
前提是AndroidMainfest.xml中已经定义了:
之后onConfigurationChanged才能得到回调。
onConfigurationChanged方法是在xml文件中定义了属性后,并且视图显示后屏幕的方向发生改变,这个方法才会被回调。
在onConfigurationChanged可以拿到屏幕改变后的屏幕方向的值,确认屏幕的方向。很多操作也是可以在这个回调方法中执行。
(三)screenOrientation属性
这个属性相对来说就没那么多人使用了,但是也是有用的,它可以设置屏幕默认的方向,但是仅仅是默认显示,设置后还是可以在代码中改变屏幕的方向的!
screenOrientation有如下选项:
1.unspecified 默认值,由系统判断状态自动切换
2.landscape 横屏
3. portrait 竖屏
4.user 用户当前设置的orientation值
5. behind 下一个要显示的Activity的orientation值
6. sensor 使用传感器 传感器的方向
7. nosensor 不使用传感器 基本等同于unspecified
screenOrientation只能选择一个值!一般设置都是横屏或竖屏,其他也是很少使用的。
上面也说了这里只是设置的一个默认值,屏幕的方向是可以通过代码被改变。
如果你想一直保持横屏或竖屏,可以在onConfigurationChanged方法后设置屏幕的方向。
(三)生命周期的知识
系统不同会导致切屏出现不同的反应,查看网上资料发现,好像手机品牌不同也会出现不同的反应。
横竖屏切换 切换到横屏,然后切换到竖屏,销毁了两次
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume 修改AndroidManifest.xml,把该Activity添加 android:configChanges="orientation",切横屏,再切回竖屏,发现不会再打印相同信息,只销毁一次,但多打印了一行onConfigChanged onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
onConfigurationChanged 更改android:configChanges="orientation|keyboardHidden",切横屏,再切回竖屏,就只打印onConfigChanged
onConfigurationChanged
onConfigurationChanged
(四)Activity的生命周期
当复习一下:
onCreate、onStart、onResume、onPause、onStop、onDestory、onRestart,一共七个生命周期的方法
Android屏幕横竖屏切换和生命周期管理的详细总结的更多相关文章
- [android] activity横竖屏切换的生命周期
模拟器横竖屏切换,ctrl+f11 界面activity会销毁,重新打开创建 第一种做法: 定死就是横屏 在清单文件,<activity/>节点部分,添加属性,设置屏幕朝向 android ...
- 无废话Android之activity的生命周期、activity的启动模式、activity横竖屏切换的生命周期、开启新的activity获取他的返回值、利用广播实现ip拨号、短信接收广播、短信监听器(6)
1.activity的生命周期 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环: (1)Activity的完整生命周期 自第一次调用onCrea ...
- 你还在问android横竖屏切换的生命周期?
本文原创,转载请注明来自xiaoQLuhttp://www.cnblogs.com/xiaoQLu/p/3324503.html 开源帮助android获得了飞速的发展,开源也导致了数不清的碎片问题. ...
- Android横竖屏切换的生命周期
1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate--> onStart--> onResume--> 3.按crtl+ ...
- Android Activity横竖屏转换的生命周期
新创建一个Activity,用来此次测试. 先贴代码 package com.hugo.apj.activitylifetest; import android.support.v7.app.AppC ...
- Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程
最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...
- 解决Android手机 屏幕横竖屏切换
Android中当屏幕横竖屏切换时,Activity的生命周期是重新加载(说明当前的Activity给销毁了,但又重新执行加载),怎么使屏幕横竖屏切换时,当前的Activity不销毁呢? 1. 在An ...
- android:configChanges 屏幕横竖屏切换
出处:http://blog.csdn.net/djy1992/article/details/9378195 ---> android:screenOrientation="por ...
- Android的横竖屏切换
android的横竖屏切换,也会发生不少问题. 1. 锁定屏幕方向,禁止切换: 在AndroidManifest.xml中的Activity参数中加上 android:screenOrientat ...
随机推荐
- K2 BPM_K2受邀出席SAP研讨会:共话“智能+”时代下的赋能与转型_全业务流程管理专家
3月5日,第十三届全国人大二次会议在北京召开.政府工作报告首次出现“智能+”,并明确指出2019年,要打造工业互联网平台,拓展“智能+”,为制造业转型升级赋能.从政府工作报告中不难看出,“智能+” ...
- MySQL时间类型及获取、展示处理
MySQL时间格式 mysql所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值 ...
- C++手动调用析构函数无效问题排查
在学习C++的时候,都知道不要手动调用析构函数,也不要在构造函数.析构函数里调用虚函数.工作这么多年,这些冷门的知识极少用到,渐渐被繁杂的业务逻辑淹没掉. 不过,最近项目里出现了析构函数没有被正确地调 ...
- CDH5.16.1的Hbase1.2的G1参数配置
1 贴一下自己的G1垃圾收集器参数(region server配置了5G内存) -Xmx5g -Xms5g -XX:MaxDirectMemorySize=5g -XX:+UseG1GC -XX:+U ...
- linux终端c语言改变输出字体颜色
Linux下C改变输出字体颜色 例: #include int main() { printf("\033[31mThis is RED.\n\033[0m"); return 0 ...
- 归并排序C程序详解
#include <iostream> #include <cstring> #include <cstdlib> using namespace std; //归 ...
- 集合篇-----ArrayList与LinkedList之间的那些小事
各自特性: ArrayList : 是一由连续的内存块组成的数组,范围大小可变的,当不够时增加为原来1.5倍大小,数组. :调用trimToSize方法,使得存储区域的大小调整为当前元素数量所需要的 ...
- bzoj 1787 && bzoj 1832: [Ahoi2008]Meet 紧急集合(倍增LCA)算法竞赛进阶指南
题目描述 原题连接 Y岛风景美丽宜人,气候温和,物产丰富. Y岛上有N个城市(编号\(1,2,-,N\)),有\(N-1\)条城市间的道路连接着它们. 每一条道路都连接某两个城市. 幸运的是,小可可通 ...
- KeyboardEvent keyCode Property
Definition and Usage The keyCode property returns the Unicode character code of the key that trigger ...
- Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/usr/local/bin/tensorboard'
使用pip install --user tensorflow-serving-api命令即可