写在前面
作为一个刚入门的Android开发,每当我自以为学有所成的时候,总会在n种地方看到n种打脸...啥也不说了,开始学习。
学习路线参考 https://github.com/francistao/LearningNotes
Activity有什么
生命周期
常规生命周期
onCreate -->onStart --> onResume --> onPause --> onStop-->onDestory
退到后台
onPause-->onStop
返回前台
onRestart-->onStart->onResume
锁屏
onPause-->onStop
解锁
onStart-->onResume
Activity之上有弹窗,未完全覆盖
onPause-->onStop
横竖屏切换
- 切换到横屏
onPause-->onStop-->onResume-->onCreate-->onStart-->onResume 也就是说Activity被销毁重创建了一次 - 切回竖屏
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume
也就是说activity被销毁重建了2次,不过为什么呢? - 一般情况下对横竖屏做限制,比如限制竖屏,在清单文件中进行<activity>节点中添加
android:screenOrientation="portrait" - 或者禁止横竖屏切换时更改生命周期,在清单文件<activity>节点下添加
android:configChanges="orientation|keyboardHidden|screenSize"
api13以上需要添加screenSize
如果只有orientation,那么切屏时还是调生命周期方法,不过只会调用一次 - 可以通过判断横竖屏的方式加载不同的布局
- 在onCreate中通过 this.getResources().getConfiguration().orientation
- 重写onConfigurationChanged方法
- 在onCreate()方法中通过 this.getResources().getConfiguration().orientation 判断加载不同的布局
什么时候调用OnRestart()
一般情况下,当前Activity从不可见状态变为可见状态时,onRestart()方法就会被调用。如果用户点击Home键返回了前台或者从一个Activity跳转到另一个Activity,如果用户再次返回这个Activity,这个方法就会被执行
异常情况下生命周期分析
- 资源相关的系统配置发生改变导致Activity被杀死并重新创建,比如横竖屏切换
这时候Activity被销毁,onPause() onStop() onDestory() 肯定会被调用,因为Activity是在异常情况下终止的,所以系统会调用onSaveInstanceState()方法来保存当前Activity的状态,它在onStop()之前,但是与onPause()并没有先后关系,而且这个方法只出现在Activity被异常销毁的时候,并且Activity重新创建时系统会调用onRestoreInstanceState(),这时候通过onSaveInstanceState()存下的Bundle对象会传过来,我们可以通过onRestoreInstanceState()和onCreate()方法来恢复数据,onRestoreInstanceState()调用时机在onStart()之后。这里需要注意的是,系统会自动帮我们恢复Activity的视图结构。界面重启后恢复,比如文本框中输入的数据,列表的滑动位置等。如果想确定特定view恢复了什么数据,可以去看view源码中的onSaveInstanceState()和onRestoreInstanceState()方法,比如通过TextView源码可以发现他保存了自己的文本选中状态和文本内容。
待续
发现总结的太慢,先了解了再总结
参考
https://github.com/francistao/LearningNotes
https://blog.csdn.net/ouyang_peng/article/details/9282965
https://www.jianshu.com/p/50a6376fa87e
《Android开发艺术探索》
网友评论