基本考点
配对法记忆Activity的生命周期方法
- onCreate() ------ onDestroy()
- onStart() ---- onRestart() ----- onStop()
- onResume() --- onPause()
- onSaveInstanceState() ------ onRestoreInstanceState()
用户行为会改变Activity的状态,由前后变化的状态可推断出中间执行了哪些回调方法
- 第一次启动应用的时候:无 ----> 运行状态(onCreate() ----> onStart() ----> onResume())
问题:
Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?
- 按Home键、启动新的Activity时:运行状态 ----> 停止状态(onPause() ----> onStop())
- 当用户重新又回到该Activity(点击后台任务栈或点击该应用的图标就可以回到该Activity)时:停止状态 ----> 运行状态(onRestart() ----> onStart() ----> onResume())
- 此时当该Activity上弹出了对话框、启动了采用透明主题的新Activity:运行状态 ----> 暂停状态(onPause())
- 对话框消失、又回到了该Activity上:暂停状态 ----> 运行状态(onResume())
- 当用户按back键回退时,该Activity从任务栈中弹出:运行状态 ----> 无(onPause() ----> onStop() ----> onDestroy())
以上都是用户正常的操作触发的生命周期回调,属于典型情况。
下面介绍一下在异常情况下所触发的生命周期回调
- 情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建(例如假设activity属性配置那里已经设置允许可横竖屏切换)
手机屏幕旋转:运行状态 ----> 无 ----> 运行状态
(onSaveInstanceState() ----> onPause() ----> onStop() ----> onDestroy() ----> onCreate() ----> onStart() ----> onRestoreInstanceState() ----> onResume())
或者
(onPause() ----> onSaveInstanceState() ----> onStop() ----> onDestroy() ----> onCreate() ----> onStart() ----> onRestoreInstanceState() ----> onResume())
(当然我们可以阻止系统重新创建我们的Activity,以后会介绍到)
- 情况2:资源内存不足导致低优先级的Activity被杀死(只有是在异常情况下onSaveInstance()和onRestoreInstanceState()放才会被调用)
首先我们弄情况优先级(降序):运行状态的Activity所在的进程 > 暂停状态的Activity所在的进程 > 停止状态的Activity所在的进程 > 没有四大组件支撑的后台进程
当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程(注意不是仅销毁一个Activity,而是整个应用进程)
- 情况3:手机连接着电脑重新调试应用,会把原先在运行的进程杀死重启一个新的进程,这时Activity会重启(这不是用户行为,而是开发者行为)
onSaveInstanceState()方法会在Activity从可见状态变成不可见状态(即停止状态)时执行,但onRestoreInstanceState()只有在Activity重启(即Activity要经历过onDestroy()和接连着执行onCreate()方法)并且系统判断onCreate()方法里的onSavedInstanceState对象不为空时才会被执行。
其实,想要取出onSavedInstanceState对象里面的值并进行恢复,除了在onRestoreInstanceState()里执行该操作之外,还可以在onCreate()里执行,毕竟我们在onCreate()方法声明上就能清晰地看到onSavedInstanceState这个对象,不过一定要先判断其是否为空,否则会报空指针异常。
if (savedInstanceState!=null){
String name = ""+savedInstanceState.get("name");
}
奇葩问题
什么情况下Activity会回调onCreate()而不会回调onStart()?
答:在onCreate方法里调用finish()方法,这样就会直接回调onDestroy方法而不会走onStart流程。