导航:首页 > 操作系统 > android横屏生命周期

android横屏生命周期

发布时间:2023-01-08 06:31:20

1. android 横竖屏切换导致的onCreate执行两次

        最近开发一款手机播放器,节目列表界面是竖屏的,而播放界面需要是横屏的。测试过程中,从播放界面退回到列表界面时,列表会重新加载,看了一下打印,回到列表界面后,onCreate居然又执行了,而且是执行了两次。

        按照activity的生命周期来说,onCreate一般只会执行一次的,从其他界面返回,居然还会再执行两次,很奇怪的现象。

        网上搜了搜,应该是跟横竖屏切换有关,于是测试了一下。先把播放界面修改为竖屏,从播放界面返回后,列表界面正常,onCreate没有被重复调用,说明onCreate的执行和横竖屏切换是有关的。网上看到很多人说,在AndroidManifest.xml设置一下,添加 android:configChanges="orientation|keyboardHidden|screenSize" ,于是照做,再测试,果然解决问题。

2. Activity横竖屏切换生命周期变化

onCreate ,
创建activity时调用。设置在该方法中,还以Bundle中可以提出用于创建该 Activity 所需的信息。
onStart ,
activity变为在屏幕上对用户可见时,即获得焦点时,会调用。
onResume ,
activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)
onSaveInstanceState
onPause ,
activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的
onStop ,
activity被停止并转为不可见阶段及后续的生命周期事件时,即失去焦点时调用
onDestroy ,
activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用 finish()方法 或者系统决定停止该活动以释放资源。
onRestoreInstanceState ,
Android在横竖排切换时候,将主动销毁activity和重新创建一个新的activity出来,在此过程中,onRestoreInstanceState就要被回调
onConfigurationChanged ,
配置指定属性后,屏幕方向发生变化后回调此函数.

把该Activity添加
android:configChanges="orientation" ,
执行步骤3(切换成横屏时)

android:configChanges="orientation" 对于4.04.0以上版本不生效

把该Activity添加 android:configChanges="orientation|screenSize" ,
执行步骤3(切换成横屏时)

onConfigurationChanged-->
只打印onConfigChanged

把 android:configChanges="orientation|screenSize" 改成 android:configChanges="orientation|keyboardHidden|screenSize"
执行步骤3(切换横屏幕)
只打印
onConfigChanged

执行步骤4(切换竖屏幕)
只打印onConfigChanged
切记一定要加上后边的screenSize否则在4.0以上版本生命周期执行不生效。

当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变
Activity运行时按下HOME键(跟被完全覆盖是一样的):
onPause --> onStop onRestart -->onStart--->onResume
Activity未被完全覆盖只是失去焦点:onPause--->onResume

测试用手机版本5.1.1
Android实现屏幕旋转方法

这种方法的优点:即使屏幕旋转,Activity也不会重新onCreate。
缺点:屏幕只有一个方向。

这个方法的优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。
4.设置方向的其他方式
在AndroidManifest.xml设置
横向显示,但是基于设备传感器,既可以是按正常方向显示,也可以反向显示,在API Level 9中被引入。
android:screenOrientation="sensorLandscape"

纵向显示,但是基于设备传感器,既可以是按正常方向显示,也可以反向显示,在API Level 9中被引入。
android:screenOrientation="sensorLandscape"

demo

3. 如何让手机横竖屏切换不重走Activity生命周期

扩展补充:
一:
Activity中还有一属性和屏幕方向有关:
<activity
. . .
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
. . .
</activity>

比如,在Mainifest.xml的Activity元素中增加这么一个属性:
android:screenOrientation="portrait"
则无论手机如何变动,拥有这个属性的activity都将是竖屏显示。
android:screenOrientation="landscape“,为横屏显示。

4. Android屏幕配适、版本配适与多语言支持

目前主流的屏幕密度:240dpi (480 * 800px) , 320dpi (720*1280px) , 480dpi(1080*1920px)现在新出的手机几乎全是全高清屏(1080*1920px)

Android图片资源目录

mdpi [1倍]160dpi

hdpi [1.5倍]   240dpi

xhdpi [2倍]   320dpi

xxhdpi [3倍] 480dpi

xxxhdpi [4倍] 640dpi

因此对其他图片资源的建议是:

a.一般采用720 * 1280的屏幕尺寸设计,这样切图可以直接适配720 * 1280的机型。

b.720 * 1280下切的图基本可以适配大部分机型。

d.适配480 * 800的机型,只需要把切图 * 0.75。

e.适配1080 * 1920 的机型,只需要把切图 * 1.50即可。

a.以720 * 1280作为设计标准,画布大小定位720 * 1280 (以后1080*1920px做标准亦可,类推)

b.只使用偶数单位的尺寸

c.尽量只使用 24pt, 28pt , 32pt, 44pt大小的字体

d.设计完成之后,所有尺寸的px值除以2作为dp数据交给开发人员

e.三份切图,分别是:xhdpi,hdpi,mdpi的资源,如果要切一份就使用xhdpi

栅格系统的最小单位是8dp,一切距离、尺寸都应该是8dp的整数倍,所有可操作元素最小点击区域尺寸为48dp X 48dp。以下是一些常见的尺寸与距离:

有时候在自定义view,draw的时候单位往往是px,要做一个dpi的转换,需要通过该类获取屏幕的信息,如:屏幕密度,宽高等。

a.尽量使用线性布局(LinearLayout)和相对布局(RelateLayout),尽量不使用绝对布局(AbsoluteLayout)和帧布局(FrameLayout)。

b.尽量使用wrap_content、mach_parent让view自适应或最大化,尽量不要写宽高的值。

c.使用线下布局的百分比weight权重时,要把能伸缩方向的宽度写成“0dp“,如果写成wrap_coent会使布局效果不佳等问题。

d.尽量使用android的Shape自定义view背景,这样会随之自适应。

e.ImageView的ScaleType有几种方式:matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY;尽量使用fitCenter按比例扩大至view宽度,能取得较好适配和显示效果。(更多请参考: Android中的ImageView配适 )

f.获取屏幕分辨率信息,进行动态适配。(参考第三大点)

a.把屏幕设置成单一的横屏或竖屏:

b.根据横竖屏加载不同布局(android: screenOrientation="sensor")

通过this.getResources().getConfiguration().orientation来判断当前是横屏还是竖屏,然后在onCreate方法中加载不同的布局

采用第二种方式要注意的有两点

布局问题:

需要在res目录先建立layout-land和layout-port目录相应的xml文件名字相同,然后在两个文件夹下创建相同名字的两套xml,系统就会根据不同的屏幕来进行自动寻找。

切换时activity的生命周期:

activity生命周期在切换横竖屏会有一些有趣的变化

a.不设置activity的android:configChanges时,切换横屏,activity的生命周期会重新调用一次,但是切换竖屏时,生命周期会重新调用两次。

b.当设置activity的android:configChanges=“orientation”时,切换横竖屏都会重新调用各生命周期一次。

c.当设置activity的android:configChanges=“orientation|keyboardHidden”(大于api13时,需要设为“orientation|screenSize”)时,切换横竖屏不会重新调用各生命周期,只会调用onConfigurationChanged方法。

一般设为b或者c

平板应用的特性:

对于大屏幕的平板8英寸以上(参考ipad mini,现在很多高端手机都是5-6英寸了,8英寸以上视为平板吧),基与平板应用的特性,平板应用开发一般采取如下两种策略

1)兼容模式

采用单activity(或者尽量少activity)+多fragment的结构开发应用,在layout资源文件中创建三套布局:手机布局、平板横屏布局、平板竖屏布局。

优点:

        只需要维护一个app

缺点:

        设计及实现的难度变大,更复杂,有时候需要采取折衷方案

        手机apk上由于含有平板的大分辨率图片资源(设计上可以减少内置资源)

2)开发另一套只适配平板的app

优点:

        与手机app分离独立。不会因为要兼容而采用一些折衷方案,影响其性能、内存

        设计和实现更加自由

缺点:

        需要维护两套app

目前谷歌推荐第一种方案,但是国内很多应用是采取第二种方案。

可以通过判断sdk的版本(Build.VERSION.SDK_INT),来为能够使用的版本进行个性化设置

例如:沉浸式状态栏配适

在Android系统4.4以前,状态栏的背景色和字体颜色都是不能改变的。但是4.4以后Google增加了改变状态栏背景透明的方法。可以通过判断sdk的版本,来为能够使用的版本进行个性化设置:

沉浸式状态栏是Android在5.0中引入的,在5.0之前是没有的,并且在Android6.0中沉浸式状态栏的使用方法和5.0不一样,因此需要做到版本兼容,针对于不同的Android进行适配,同样也是通过判断Build.VERSION.SDK_INT来区分版本,进行个性化配适

沉浸式状态栏的实现方式有好几种,更多请参考 沉浸式状态栏的实现

原则:内置图片资源不应该出现文字(如果出现文字需要具备)、所有的文字需要放在res资源目录特定语言目录下。

5. Android Activity生命周期都该做哪些事情

activity主要生命周期的方法说明: onCreate(Bundle savedInstanceState):创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!
onStart():activity变为在屏幕上对用户可见时调用。
onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。 onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!
onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。 OnDestroy():activity被完全从系统内存中移除时调用,该方法被 2.横竖屏切换时候activity的生命周期
1、新建一个Activity,并把各个生命周期打印出来
2、运行Activity,得到如下信息
onCreate-->onStart-->onResume-->
3、按crtl+f12切换成横屏时
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
4、再按crtl+f12切换成竖屏时,发现打印了两次相同的log
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
5、修改AndroidManifest.xml,把该Activity添加 android:configChanges="orientation",执行步骤3
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
6、再执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onConfigurationChanged-->
7、把步骤5的android:configChanges="orientation" 改成 android:configChanges="orientation|keyboardHidden",执行步骤3,就只打印onConfigChanged
onConfigurationChanged-->
8、执行步骤4
onConfigurationChanged-->onConfigurationChanged-->
总结:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

总结一下整个Activity的生命周期
补充一点,当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变
Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState --> onPause --> onStop onRestart -->onStart--->onResume
Activity未被完全覆盖只是失去焦点:onPause--->onResume

6. Android Activity横竖屏切换生命周期

面试被问到横竖屏切换时Activity的生命周期,正好记录一下验证过程~

横竖屏切换涉及到的是Activity的android:configChanges属性,而与其android:launchMode属性没有关系;
android:configChanges可以设置的属性值有:

新建Activity,重写各个生命周期方法:

运行Activity,生命周期如下:

切换横屏,生命周期如下:

再切回竖屏,生命周期如下:

修改AndroidManifest.xml,添加 android:configChanges="orientation" 并切换横屏,生命周期如下:

再切换竖屏,生命周期如下:

修改AndroidManifest.xml,属性改为 android:configChanges="orientation|keyboardHidden|screenSize" ,切换横屏,生命周期如下:

再切换回竖屏,生命周期如下:

7. 当Android设备屏幕由横屏变成竖屏时Activity的生命周期是如何变化的

Android设备屏幕由横屏变成竖屏时,实际上当前屏幕中的Activity要经历的过程是:首摧毁当前Activityà重新创建一个Activity来适应屏幕的变化。那么根据Activity的状态变化分析我们可以看出它经历的生命周期应该是:

在这个过程中最有可能让大家产生误解的就是:屏幕状态变化时没看到Activity消失,他实际上确实销毁后又重新重建了。这些都是属于Android的基础知识,推荐你可以去个叫秒秒学的网站上看看,里面有一些相关的课程,希望对你有帮助。

8. android 屏幕旋转生命周期和setRequestedOrientation强制旋转

屏幕会根据当前传感器进行自动旋转,旋转之后,activity屏幕的 生命周期不会发生变化 ,在activity中只会回调onConfigurationChanged方法

可见每次旋转onDestory()方法都会被调用,如果要保存一些activity被销毁前的数据的可以在onSaveInstanceState()方法中通过Bundle去保存

当我们调用了:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
或者
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
之后屏幕不会再自动旋转回来的情况

关于这点:我在b站App端也发现相关问题,点进b站的播放视频界面,我们手机开启屏幕自动旋转,当我们横竖屏旋转的时候是可以正常横竖屏切换的,但是我们点击视频右下角的放大(就是横屏)之后,自动旋转就失效了,要竖屏的话需要再点击一次

关于这个问题,就是我们说的setRequestedOrientation之后重力传感失效的问题,处理的方法也很简单
在AndroidManifest.xml中设置了android:configChanges="orientation|keyboardHidden|screenSize的基础上,在onConfigurationChanged中调用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR) 方法,使其恢复重力传感即可

阅读全文

与android横屏生命周期相关的资料

热点内容
ascii码是编译的时候用吗 浏览:779
压缩机感应包可以通用吗 浏览:410
方舟服务器怎么发布到搜索列表 浏览:270
xml防反编译 浏览:239
数据传输加密系统技术方案 浏览:842
程序员没有准备去面试 浏览:4
51单片机usb鼠标 浏览:879
qq服务器的ip地址查询 浏览:112
java仿qq聊天 浏览:400
解压的ipa重新打包 浏览:142
程序员那么可爱vip版 浏览:239
程序员怎么升职 浏览:243
图形化命令按钮vb 浏览:987
vcu盘加密怎么设置 浏览:414
如何加密备份微信聊天记录 浏览:528
安卓手机如何模拟键盘 浏览:931
查看dns地址命令 浏览:767
android录屏工具 浏览:841
成都互动直播系统源码 浏览:955
usb蓝牙android 浏览:409