Activity的生命周期全面分析(一)
《Android开发与探索》
目录
一、典型情况下生命周期分析
1.七种典型
onCreate:表示活动正在被创建,常常在里面做一下初始化工作
onDestroy:表示活动即将被销毁,可以在里面做一下回收工作
onStart:表示活动正在被启动,即将开始,在后台了
onStop:表示活动即将停止,可以做一些轻的回收工作
onResume:表示活动已经可见了,在前台了
onPause:表示活动正在停止,正常情况下,后面紧跟onStop操作
onRestart:活动正在重写启动,一般下,当前活动从不可见重新变为可见时,就调用
onCreate和onDestroy配对,标识创建和销毁,并且只可能有一次调用
onStart和onStop配对,表示设备的后台操作
onResume和onPause配对,表示设备的前台操作
2.问题思考
Q1:onStart和onResume、onPause和onStop从描述上来看起来差不多,对我们来说有什么实质的不同呢?
onStart和onStop是从可见的角度去回调的
onResume和onPause是从是否位于前台的角度去回调的
Q2:假设当前Activity为A,如果这时用户打开一个新Activity B,那么B的onResume和A的onPause那个先执行?
结论:旧的Activity先onPause,然后新的Activity在启动
A------------onPause
B------------onCreate
B------------onStart
B------------onResume
A------------onStop
所以要求尽量在onStop里面去做逻辑
二、异常情况下的生命周期分析
1.资源相关的系统配置发生改变导致Activity被杀死并重新创建
例如:活动处于竖屏状态,如果突然旋转屏幕,由于系统配置发生了变化,在默认情况下,活动就会被销毁并且重新创建,当然也可以阻止重新创建。我们按照默认的情况去分析。
异常情况下终止,Activity会去调用onSaveInstanceState来保存当前活动的状态,然后进行重写创建;重新创建的时候会调用onRestoreInstanceState和onCreate方法去恢复部分数据。
保存和恢复的流程:活动调用onSaveInstanceState去保存数据,然后Activity去委托window,window去委托它上面的顶级容器viewgroup/dectorview去保存,最后顶层容器再一一通知它的子元素去保存数据。
(1).保存状态
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String t = savedInstanceState.getString("restore_data");
Log.d("MainActivity", "onRestore------" + t);
}
(2).恢复状态
接受的位置可以选择onCreate或者onRestoreInstanceState.
两者的区别是onRestoreInstanceState一旦被调用,里面的bundle是有值的,不用去判空。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String t = savedInstanceState.getString("restore_data");
Log.d("MainActivity", "onCreate------" + t);
}
}
而onCreate必须要进行额外判断
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String t = savedInstanceState.getString("restore_data");
Log.d("MainActivity", "onRestore------" + t);
}
更详细的可见转向这个链接的文章:
https://www.jianshu.com/p/27181e2e32d2
2.资源内存不足导致低优先级的Activity被杀死
先描述一个Activity的优先级:
前台活动(正在和用户交互)—高>>>>可见非前台活动(被一个对话框挡住的Activity)—中 >>>>>后台活动----低
如果一个进程中没有四大组件在执行,那么很快就会被杀死,所以我们要将后台工作放在service中
3.不想让Activity在屏幕旋转的时候重新创建
android::configChanges="orientation"