在上一篇文章 Activity生命周期之正常情况 中,分析了正常情况的生命周期的调度,除了用户正常操作所引起的生命周期的变化外,还存在着一些异常情况,比如系统配置的改变或者内存不足的情况,这些情况下,Activity可能被杀死。
- 相关系统配置改变导致生命周期的变化
典型的情况就是手机横竖屏的变化,默认情况下,当Activity处于竖屏状态的时候,突然旋转屏幕,Activity会被销毁并且重建,当然我们也可以阻止重新创建Activity(文末提供)。
默认情况下,如果Activity不做任何处理,系统配置改变后,Activity会被销毁并重新创建。销毁过程,Activity的onPause
、onStop
、onDestroy
都会调用,同时由于Activity在异常情况下终止的,系统会调用onSaveInstanceState
来保存当前的Activity的状态,这个方法在onStop
之前调用。注意 这个方法只在Activity被异常终止的情况下调用,正常情况下Activity是不会调用这个方法。
当Activity被重新创建后,系统会调用onRestoreInstanceState
,并且把Activity销毁时onSaveInstanceState
方法所保存的Bundle
对象传递给onRestoreInstanceState
和OnCreate
方法。因此我们可以通过onRestoreInstanceState
和OnCreate
方法来判断Activity是否被重建了,如果是重建,就可以取出之前保存的数据并恢复。onRestoreInstanceState
调用在onStart
之后。
销毁至重建的流程:onPause
->onSaveInstanceState
->onStop
->onDestroy
->(销毁后重建)onCreate
->onStart
->onRestoreInstanceState
->onResume
同时,异常情况下终止,会调用onSaveInstanceState
来保存当前的状态,并在OnCreate
和onRestoreInstanceState
里恢复数据。
举个栗子
保存数据
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("test","保存的数据");
Log.i("》》》A"," onSaveInstanceState 开始保存数据");
}
获取数据
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState != null){
String data = savedInstanceState.getString("test");
Log.i("》》》A"," onCreate 获取的数据:"+data);
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String data = savedInstanceState.getString("test");
Log.i("》》》A"," onRestoreInstanceState 获取的数据:"+data);
}
-
内存不足导致Activity被杀死
这种情况不好模拟,其数据存储、恢复过程和情况1完全一致。Activity的优先级从高到低可以大致分为一下三种:- 前台Activity——正在和用户交互的Activity,优先级最高。
- 可见但非前台Activity——比如Activity中弹出了一个对话框,导致Activity可见但无法和用户直接交互。
- 后台Activity——已经被暂停或者停止的Activity,优先级最底。
当系统内存不足的时候,系统就会按照上述优先级从低到高来杀死目标Activity。并在后续通过onSaveInstance和onRestoreInstance来存储和恢复数据。
以上我们分析了系统的数据存储和恢复机制,当然也有办法让系统不去重建Activity,configChanges
属性,比如android:configChanges="orientation|screenSize"
,这种情况下,当屏幕旋转时,Activity不会被重新创建。
至此,关于Activity在正常情况和异常情况下的生命周期介绍结束了,对Activity的生命周期应该也有了深入的了解了。
欢迎关注我的博客:https://blog.manjiexiang.cn/
欢迎关注微信号:春风十里不如认识你