1、Activity的生命周期
生命周期onCreate() ->onStart()-> onResume() -> onPause() -> onStop() -> onDestroy()
682504-1405607172778d9b.png- 启动activity: 系统先调用onCreate(),然后调用onStart(),最后调用onResume()方法,activity进入运行状态。
- activity被其他activity覆盖(DialogActivity、锁屏): 系统会调用onPause()方法,暂停当前activity执行。
- 当前Activity转到新的Activity页面或按Home键回到主屏,自身退居后台:系统会先调用onPause()方法,然后调用onStop()方法,进入停滞状态。
- 用户退回到此Activity:系统会先调用onRestart()方法,然后调用onStart()方法,最后调用onResume()方法,再次进入运行状态。
- 当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
- 用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。
- onRestart():表示activity正在重新启动 ,一般情况下,当前activity从不可见重新变成可见状态时,onRestart()就会被调用,这种情形一般是用户行为所导致的,比如用户按HOME键切换到桌面然后重新打开APP或者按back键。
2、Activity异常情况下的生命周期
2.1、比如当资源相关的系统配置发生改变以及系统内存不足时,Activity就可能被杀死。
情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建
比如说当前Activity处于竖屏状态,如果突然旋转屏幕,由于系统配置发生了改变,在默认情况下,Activity就会被销毁并且重新创建,当然我们也可以阻止系统重新创建我们的Activity。
在默认情况下,如果我们不做特殊处理,那么当系统配置发生改变后,Activity就会被销毁并重新创建。
682504-c7df1f922a04d7c2.png
当系统配置发生改变以后,Activity会销毁,onPause、onStop、onDestroy均会被调用,由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity状态,这个方法的调用实际是在onStop之前,与onPause没有既定的时序关系。
当Activity重新创建后,系统会调用onRestoreInstanceState并且把Activity销毁时onSaveInstanceState方法保存的Bundle对象作为参数同事传给onRestoreInstanceState和onCreate方法。因此,我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建了,如果被重建了,那么我们就可以去除之前保存的数据并恢复,从时序上来说,onRestoreInstanceState的调用时机在onStart之后。
同时,我们要知道,在onSaveInstanceState和onRestoreInstanceState方法中,系统自动为我们做了一定的恢复工作。比如文本框中用户输入的数据,ListView滚动的位置等。这些View相关的状态系统都能够默认为我们恢复。
情况2:资源内存不足导致低优先级的Activity被杀死
同情况1数据存储和恢复完全一致,Activity安好优先级从高到底可以分为三种:
- 前台Activity ----- 正在和用户交互的Activity,优先级最高。
- 可见但非前台Activity ----- 比如Activity中弹出一个对话框,导致Activity可见但是位于后台无法和用户直接交互。
- 后台Activity ----- 已经被暂停的Activity,比如执行了onStop,优先级最低。
当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。
防止重新创建就可以给configChanges属性添加orientation这个值
android:configChanges="orientation"
3、Activity启动模式 ( LaunchMode )
四种启动模式:standard、singleTop、singleTask 和 singleInstance。
- standard : 标准模式。这也是系统的默认模式。每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否存在。
- singleTop : 栈顶复用模式。在这种模式下,如果新 Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建,同时它的 onNewIntent 方法会被回调,通过此方法的参数我们可以取出当前请求的信息。需要注意的是,这个 Activity 的 onCrate、onStart 不会被系统调用,因为它并没有发生改变。
- singleTask : 栈内复用模式。这是一种单实例模式,在这种模式下,只要 Activity 在一个栈中存在,那么多次启动此 Activity 都不会重新创建实例,和 singleTop 一样,系统也会回调其 onNewIntent 。清除此 Activity 上方的 Activity。
- singleInstance 单实例模式。这是一种加强的 singleTask 模式,它除了具有 singleTask 模式的所有特性外,还加强了一点,那就是具有此模式的 Activity 只能单独地位于一个任务栈中。
网友评论