概述:
典型的Activity 生命周期众所周知,就不用多说了吧;我们知道,Activity除了受用户操作所导致的正常的生命周期方法调度,还有一些异常情况,比如当资源相关的系统配置发生了改变以及系统内存不足时,Activity就可能被杀死,下面就来具体分析这两种情况。
情况一 :
当一个activity的config改变的时候,Activity就会被杀死然后重建
而我们最熟悉的config的改变就是屏幕方向改变,系统语言改变,还有键盘可见改变了等等,系统配置发生了改变,在默认情况下,Activity就会被销毁并且重新创建,当然我们也可阻止系统重新创建我们的Activity。
在默认情况下,如果我们的Activity不做特殊处理,那么当系统配置发生改变后,Activity就会被销毁并重新创建,如图所示:
当系统配置发生改变后,Activiy会被销毁,其onPause、onStop、onDestroy 均会被调用,同时由于Activiy 是在异常情况下终止的,系统会在onStop之前调用onSaveInstanState来保存当前Activiy的状态。
所以当出现异常有重要的数据需要恢复的,要在这里做一些数据的保存工作;系统只会帮我们保存视图。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在这里我们可以把我们需要保存的东西给写入Bundle
//.......
}
然后我们保存的数据就可以在onCreate中来读取了:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState != null){
//TODO 取出数据
}
}
另一种就是一个独立的回调了:
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
二者的区别是:onRestoreInstanceState一旦被调用,其参数Bundle savedInstanceState 一定是有值的,我们不用额外的判断是否为空;但是onCreate不行,这两个方法都可以进行数据恢复,但是Google建议采用onRestoreInstanceState 去恢复数据。
情况二:
资源内存不足导致低优先级的Activity被杀死
Activity 按照优先级从高到低,可以分为三种:
(1)前台Activity——正在和用户交互的Activity,优先级最高。
(2)可见但非前台Activity——比如Activity中弹出了一个另外一个Activity的主题设置的Dialog,导致Activity可见但是位于后台无法和用户直接交互。
(3)后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低。
当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并通过onSaveInstanState和onRestoreInstanceState 来存储和恢复数据。如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死,因此,一些后台工作不适合脱离四大组件而独自运行在后台中,这样进程很容易被杀死。建议将后台工作放入Service中从而保证进程有一定的优先级,这样就不会轻易地被系统杀死了。
NOTES:虽然内容很简单,但也是博主辛苦的做了下笔记,转载请注明出处!