Android Activity横竖屏切换生命周期详解
关于Activity生命周期和横竖屏切换时,生命周期的执行过程,网上有很多文章。但是都写的很模糊,并且不完善。一般的我们去切换屏幕方向都是不希望Activity被重新创建,这时就需要对一些属性进行设置,或者使用代码设置。文章通过以上方面解析Activity在横竖屏切换时,生命周期方法执行过程。
1.Activity生命周期
2.configChanges属性解析
3.orientation属性
4.keyboardHidden属性
5.screenSize属性
6.总结
activity生命周期方法
默认情况下,activity从创建到销毁会执行以下生命周期方法
onCreate -->onStart–>onResumeo -->nPause -->onStop -->onDestroy
configChanges属性详解1.orientation 屏幕在纵向和横向间旋转
2.keyboardHidden 键盘显示或隐藏
3.screenSize 屏幕大小改变了
4.fontScale 用户变更了首选的字体大小
5.locale 用户选择了不同的语言设定
6.keyboard 键盘类型变更,例如手机从12键盘切换到全键盘
7.touchscreen或navigation 键盘或导航方式变化,一般不会发生这样的事件
常用的包括:orientation keyboardHidden screenSize,设置这三项界面不会走Activity的生命周期,只会回调onConfigurationChanged方法。
1.unspecified 默认值,由系统判断状态自动切换
2.landscape 横屏
3. portrait 竖屏
4.user 用户当前设置的orientation值
5. behind 下一个要显示的Activity的orientation值
6. sensor 使用传感器 传感器的方向
7. nosensor 不使用传感器 基本等同于unspecified 仅landscape和portrait常用,代表界面默认是横屏或者竖屏,还可以再代码中更改。
1.AndroidManifest没有设置configChanges属性
竖屏启动: onCreate -->onStart–>onResume 切换横屏: onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate–>onStart --> onRestoreInstanceState–>onResume -->onPause -->onStop -->onDestroy 横屏启动: onCreate -->onStart–>onResume 切换竖屏: onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate–>onStart --> onRestoreInstanceState–>onResume -->onPause -->onStop -->onDestroy2.AndroidManifest设置了configChanges android:configChanges=“orientation”
竖屏启动: onCreate -->onStart–>onResume 切换横屏: onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate–>onStart --> onRestoreInstanceState–>onResume -->onPause -->onStop -->onDestroy 横屏启动: onCreate -->onStart–>onResume 切换竖屏: onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate–>onStart --> onRestoreInstanceState–> onResume -->onPause -->onStop -->onDestroy3.AndroidManifest设置了configChanges android:configChanges=“orientation|keyboardHidden|screenSize”
竖(横)屏启动:onCreate -->onStart–>onResume 切换横(竖)屏:onConfigurationChanged (Android 6.0 Android 7.0 Android 8.0)4.AndroidManifest设置了configChanges android:configChanges=“orientation|screenSize”
竖(横)屏启动:onCreate -->onStart–>onResume 切换横(竖)屏:onConfigurationChanged (Android 6.0 Android 7.0 Android 8.0) 注意:代码动态设置横竖屏状态(onConfigurationChanged当屏幕发生变化的时候回调)setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
1.没有设置configChanges属性,当前的界面调用onSaveInstanceState走一遍流程,然后重启调用onRestoreInstanceState再走一遍完整流程,最终destory。
2.设置了configChanges属性为orientation之后,Android6.0 同没有设置configChanges情况相同,完整的走完了两个生命周期,调用了onSaveInstanceState和onRestoreInstanceState方法;Android 7.0则会先回调onConfigurationChanged方法,剩下的流程跟Android 6.0 保持一致;Android 8.0 系统更是简单,
只是回调了onConfigurationChanged方法,并没有走Activity的生命周期方法。
3.设置android:configChanges=“orientation|keyboardHidden|screenSize” 则都不会调用Activity的其他生命周期方法,只会调用onConfigurationChanged方法。
4.没有了keyboardHidden跟3是相同的,orientation代表横竖屏切换 screenSize代表屏幕大小发生了改变,
设置了这两项就不会回调Activity的生命周期的方法,只会回调onConfigurationChanged 。
作者:Jaynm
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341