Activity生命周期
Activity的生命周期对于Android开发者来说是最熟悉不过的东西了,回过头看安卓基础总结一下看的内容
Activity常用的生命周期有以下七个,onCreate、onRestart、onStart、onResume、onPause、onStop、onDestroy
常用生命周期
方法名 | 简介 |
---|---|
onCreate | 表示Activity正在被创建,这也是Activity的生命周期的第一个方法。 |
onRestart | 表示Activity正在重新启动,此生命周期只有在onPause与onStop都执行过才会被调用 |
onStart | 表示Activity正在被启动,即将开始,此时Activity已经可见但是还没有出现在前台,还无法交互 |
onResume | 表示Activity已经可见并出现在前台可以与用户进行交互 |
onPause | 表示Activity正在停止 |
onStop | 表示Activity停止并不可见 |
onDestroy | 表示Activity即将被销毁,这是Activity的最后一个回调 |
Activity生命周期切换过程
借一张网上的图,这个图说明了一个Activity从创建到销毁时各生命周期的状态
-
Activity第一次启动,回调如下:onCreate -> onStart -> onResume
-
打开新Activity或按Home键:onPause->onStop
如果新的Activity的Theme为Dialog或者Translucent(透明)时不会调用onStop方法
-
再次回到Activity:onRestart->onStart->onResume
-
按Back键退出Activity:onPause->onStop->onDestroy
生命周期的对应关系
Activity的生命周期是一一对应的,比如:
onCreate - onDestroy 创建与销毁,只可能为一次调用
onStart - onStop 可见与不可见,可能为多次调用
onResum - onPause 在前台与不在前台,可能为多次调用
AActivity启动BActivity
发现写的有问题已修改
正常情况下
启动BActivity:
返回AActivity:
Theme为Dialog或Translucent
启动BActivity:
返回AActivity:
异常情况下的生命周期
资源相关系统配置发生改变导致Activity被杀死并重新创建
旋转屏幕横竖屏切换
Activity正常运行,此时旋转屏幕
当系统配置被更改时Activity会被销毁并重新创建,Activity的onPause、onStop、onDestroy均会被调用,同时由于Activity是异常情况下终止并销毁的系统会调用onSaveInstanceState
方法来保存当前Activity的状态。
之后就是正常的启动流程,当然会有onRestoreInstancesState
方法在onStart与onResume之间调用用以恢复onSaveInstanceState
保存的状态。
在测试是发现onSaveInstancesState
调用时期与艺术探索里面讲的在onStop之前这个说法不一致,多次测试都在onStop之后调用了此方法,翻谷歌官方文档发现此方法调用从Build.VERSION_CODES.P
开始在onStop方法之后调用,对于面向较早平台版本的应用程序,此方法将在onStop()之前发生,并且不能保证它会在onPause()之前还是之后发生。
接下来用onSaveInstance
与onRestoreInstanceState
方法来保存与恢复数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState != null){
log("from onContext: " + savedInstanceState.getString("text"));
}
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("text","睡客");
log("数据已保存");
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
log("from onRestoreInstancesState: " + savedInstanceState.getString("text"));
}
我们可以在onCreate
和onRestoreInstanceState
方法进行数据的恢复处理,onCreate方法中有一个参数,此参数就是onSaveInstanceState
保存的值,在onCreate方法中需要对该参数进行空判断因为此参数在onCreate正常启动的情况下是为null的,至于onRestoreInstanceState
这个方法不用进行空值判断因为此方法只要被调用它的值不可能为空,代码效果如下。
资源内存不足导致低优先级Activity被杀死
Activity优先级
- 前台Activity–用户正在交互的Activity,优先级最高
- 可见但非前台Activity
- 后台Activity–已经被停止的Activity,例如执行了onStop方法,优先级最低
当系统内存不足时会按照上面的优先级进行销毁,并通过onSaveInstanceState
和onRestoreInstanceState
来存储与恢复数据。
防止Activity被重新创建
当某项内容被改变时不想停止并重新创建Activity可以通过在AndroidManifest清单文件中对该Activity指定configChanges属性来防止重新创建,比如旋转屏幕时不想重新创建Activity可以指定orientation这个属性值,如:android:configChanges="orientation"
,如果想指定多个值可以用"|’'来连接起来如:android:configChanges="orientation|keyboardHidden"
一些configChanges属性
在指定configChanges之后Activity在该系统配置改变的情况下不会重新创建Activity也不会调用onSaveInstanceState
或onRestoreInstanceState
来保存或恢复数据,取而代之的是使用onConfigurationChanged
方法。
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
log("onConfigurationChanged");
}