Android开发艺术探索阅读笔记之一:Activity的生命周期和启动模式

来源:互联网 发布:c语言文件被截断 编辑:程序博客网 时间:2024/05/18 18:20

1.1.1典型情况下生命周期
Activity的生命周期,这里我补充一个recreate方法,这个方法调用后activity会重新创建,回调onCreate->onStart->onResume.
后面说到了启动Activity的特定情况,这里关键几个:

1.打开新的Activity或者回到了桌面,回调onPause->onStop,但如果启动的新Activity采用的透明主题,那么当前Activity不会回调onStop.

2.用户再次回到原Activity(该Activity并没有被销毁),回调onRestart->onStart->onResume.

3.用户按back键回退,回调onpause->onStop->onDestroy.

4.从当前Activity A 跳转到Activity B,依次执行A的onPause->B 的onCreate->B onStart->B onResume->A onStop.

1.1.2异常情况下的生命周期

情况1:

1.资源相关的系统配置发生改变导致Activity被杀死并重新创建
比如说横竖屏幕切换,如果开发者没有配置该Activity的configChangesd的话,切换的时候系统配置发生改变将会导致Activity被销毁并且重新创建,此时Activity回调onPause->onSaveInstanceState->onDestroy->onCreate->onStart->onRestoreInstanceState(前两者的顺序不一定谁在前后).Activity被意外终止时,Activity会调用onSaveInstanceState保存数据,然后Activity委托Window去保存数据,Window在委托最上面的顶级容器(ViewGroup)去保存,最后顶级容器在去一一通知他的子元素(这些子元素必须在是xml中声明了id的,没有id将不会被保存,如果不给一个view设置一个id,那么在Activity调用onSaveInstantceState(Bundle outState)方法时,就没办法保存它的状态,而且即使它当前是焦点view,也没办法将其焦点状态记录在Bundle对象中,这会导致在需要取出Bundle状态对象时,出现问题)来保存(和Activity一样,每个View都有onSaveInstanceState和onRestoreInstanceState方法)重新创建Activity时,顶级容器通知每个带id的View回调onRestoreInstanceState,恢复过程和保存过程类似,我就不写了。

2.系统只会在Activity异常终止的时候才会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,Activity正常销毁则不触发.

情况2:资源内存不足导致低优先级的Activity被杀死

1.Activity的优先级
1).前台Activity——正在和用户交互的Activity
2).可见但没前台——Activity中弹出一个对话框,导致Activity可见但不可交互
3).后台的Activity——已经被暂停的Activity,执行了onStop(比如按了Home键,启动了新的Activity),优先级最低

当系统内存不足时,系统会按照上面的优先级来杀死activity所在的进程,然后会通过onSaveInstanceState和onRestoreInstanceState来保存和恢复数据。

补充两点:
(1)横竖屏切换时,只要给需要保存和恢复的view设置id,不需要重写onConfigurationChanged方法,系统也会给view保存数据,这个情况下是不管android:configChanges=”orientation|screenSize”是否声明的,如果声明了那Activity没被销毁和重建,数据自然不变,如果没声明,则调用那两个回调方法进行数据保存和恢复.
(2)官方文档有一句话:翻译过来是你应该在onPause方法中去存储那写持久性的数据,比如用户的输入。联想到系统自带的存储,我的理解是:系统的存储是暂时性的,而推荐在onPause要执行的存储应该是持久化的。

1.2 Activity的启动模式

四种:standard,singleTop,singleTask和singleInstance
简单介绍:
1.standard:默认的启动模式,每次启动一个activity就创建一个实例,不管该实例是否存在.
2.singleTop(栈顶复用):如果新的Activity位于栈顶则不创建实例,否则不管是否存在实例,都要重新创建该Activity.
3.singleTask(栈内复用):当一个具有sangleTask模式的Activity启动后,如果该Activity所在的任务栈存在则将该Activity置于栈顶并将该实例前面的全部清空;如果不存在该任务栈,则创建一个任务栈并将创建Activity的实例放到栈中.
4.singleInstance(单实例模式):除了具有singleTask模式外,还能单独位于任务栈中.

阅读全文
0 0
原创粉丝点击