
实践出真知
了解Activity生命周期,最好的方法当然是写个Demo,自己试一试了。
首先自己创建一个Application,在其中使用registerActivityLifecycleCallbacks
注册对Activity生命周期回调的监听。
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
override fun onActivityPaused(activity: Activity) {
Log.d(activity.localClassName, "onPause")
}
override fun onActivityResumed(activity: Activity) {
Log.d(activity.localClassName, "onResume")
}
override fun onActivityStarted(activity: Activity) {
Log.d(activity.localClassName, "onStart")
}
override fun onActivityDestroyed(activity: Activity) {
Log.d(activity.localClassName, "onDestroy")
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle?) {
Log.d(activity.localClassName, "onActivitySaveInstanceState")
}
override fun onActivityStopped(activity: Activity) {
Log.d(activity.localClassName, "onStop")
}
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
Log.d(activity.localClassName, "onCreate")
}
})
然后创建多个Activity,这样就可以开始愉快的玩耍了。
1.正常启动->正常关闭
onCreate
->onStart
->onResume
->onPause
->onStop
->onDestroy
2.OldActivity启动NewActivity
OldActivity
onPause
NewActivity
onCreate
onStart
onResume
OldActivity
onSaveInstanceState
onStop
3.关闭NewActivity,回到OldActivity
NewActivity
onPause
OldActivity
onRestart
onStart
onResume
NewActivity
onStop
onDestroy
4.OldActivity启动透明主题NewActivity
OldActivity
onPause
NewActivity
onCreate
onStart
onResume
OldActivity不会走onStop
5.关闭透明主题NewActivity,回到OldActivity
NewActivity
onPause
OldActivity
onResume
NewActivity
onStop
onDestroy
因为启动透明主题NewActivity时,NewActivity没走onStop
,同样现在也不会走onStart
6.Activity切换到后台
onPause
->onSaveInstanceState
->onStop
7.Activity从后台切换到前台
onRestart
->onStart
->onResume
8.横竖屏切换
onPause
->onSaveInstanceState
->onStop
->onDestroy
->onCreate
->onStart
->onRestoreInstanceState
->onResume
竖屏切换横屏和横屏切换竖屏,都会导致Activity的重启,走上面描述的生命周期流程。
解决方法:在清单文件相应Activity加上android:configChanges="orientation|screenSize"
。
应用面向 API 级别 13 或更高级别,必须要添加screenSize
才会生效,达到Activity不重启,且横竖屏相互切换都能触发onConfigurationChanged
。因为当设备在横向与纵向之间切换时,该配置也会发生变化。
测试发现sdk为26和27,只设置orientation
就能达到效果。(官方文档未找到相应说明)
测试均在模拟器上进行,测试sdk版本19~27。
阐述各生命周期方法
onCreate
Activity创建启动时调用。
onStart
完成onCreate后调用,或者activity处于停止再次被启动时调用。
onResume
在 Activity 即将开始与用户进行交互之前调用。onResume执行了,Activity才会显示到前台,从而与用户进行交互。
onPause
Activity正在停止时调用。不可处理太耗时操作,否则会影响新activity显示的快慢(当OldActivity的onPause执行完了时,NewActivity的onResume才会执行,NewActivity才能显示到前台)。
onStop
Activity对用户不再可见时调用。如果启动新的Activity是透明主题(此时OldActivity任然可见),将不会走onStop。不能做太耗时的操作,可稍微处理一些重量级的回收工作。
onDestroy
Activity被销毁前调用,也是Activity生命周期结束前调用的最后一个方法。处理一些回收工作和资源释放。
onRestart
在 Activity 已停止并即将再次启动前调用。NewActivity处于可见状态时,OldActivity处于onStop状态时,返回OldActivity将触发OldActivity的onRestart方法。
Activity的整个生命周期发生在onCreate和onDestroy之间。
Activity的可见生命周期发生在onStart和onStop之间。
Activity的前台生命周期发生在onResume和onPause之间。
保存Activity状态
onSaveInstanceState
在第一节中,我们发现当运行时配置发生变更和启动新的Activity时,会触发onSaveInstanceState
方法,此方法就是用来保存Activity当前状态的。为了便于Activity异常关闭,回到此Activity时页面状态恢复,给用户更友好的体验,可以在此方法中进行相应状态的保存。
注:
1.
onSaveInstanceState
如果被调用,会在onStop
之前执行,与onPause
没有一定的时序关系。2.因
onSaveInstanceState
默认实现也会恢复部分UI状态,所以重写时一定要调用超类实现。3.由于无法保证系统调用
onSaveInstanceState
必然性,所以不适合在其中进行大数据持久化操作。可在onPause
中进行。
onRestoreInstanceState
有保存状态的方法,当然有用于恢复状态的方法。当Activity重建时,系统会将Bundle传递给onCreate
和onRestoreInstanceState
。在onCreate
和onRestoreInstanceState
任一方法中都可进行状态恢复。
注:
1.当Activity被重建时,
onRestoreInstanceState
会在onStart
后调用。2.和
onSaveInstanceState
一样,在重写onRestoreInstanceState
时,也需要调用超类实现。3.
onCreate
和onRestoreInstanceState
都可以进行状态恢复,只是onCreate
中Bundle
可能是空的(在Activity第一次创建启动时)。
参考文案
- 《Android开发艺术探索》—— 任玉刚著
- 官方开发文档 —— Activity
- 官方configChanges说明
- 运行时配置变更
网友评论