Android中活动的生命周期
Activity的生命周期是安卓开发中很重要的一个点,也是在面试中经常会被问到的一点,属于需要好好了解的一部分知识
首先在这里安利一下Google官方的开发者文档,虽然是繁体中文但是大致上不影响阅读,可能需要科学上网——https://developer.android.google.cn/guide/components/activities/ ,在这里Google详细讲述了安卓活动相关的种种细节,希望在通过各种书籍视频学习时也一定要阅读这部分内容!
活动状态
在《第一行代码》第2版中将活动分为四种状态:
- 运行状态
- 暂停状态
- 停止状态
- 销毁状态
而在官方文档中,将活动分为三种状态:
- 已继续
- 已暂停
- 已停止
其实本质上相同,只是官方文档认为活动销毁后便不再算入生命周期。
当活动处在屏幕最前端且具有使用者焦点时,认为活动处于运行状态;当活动失去焦点,但仍然可见,即上层覆盖一个并不占用全屏幕的活动时进入暂停状态;当活动完全不可见(被另外一个活动完全遮挡)但仍存在于内存中时处于停滞状态。对于暂停或停止的活动,可以调用finish()方法销毁,使其在内存中清除。
活动的生命周期回调
Activity类定义了7个回调方法:
public class ExampleActivity extends Activity { |
活动的生存期可以分为三部分:
完整生存期:onCreate()和onDestory()方法之间
可见生存期:位于onStart()和onStop()方法之间,在这个生存期内活动对于用户总是可见的,但有可能无法与用户交互(焦点不聚焦在本活动)
前台生存期:onResume()方法和onPause()方法之间所经历的就是前台生存期,这个时期活动总是可以与用户交互
下面是谷歌官方提供的活动生命周期的示意图:
活动被回收了怎么办?
如果想要在活动被回收后恢复活动需要使用onSaveInstanceState()方法,这个方法携带一个Bundle类型的参数,Bundle提供了一系列用于保存数据的方法,每个保存方法需要传入两个值——键(用于取回值)和需要保存的内容。
保存的数据如何恢复?
大家可能以及注意到在onCreate()方法中有Bundle类型的参数,在一般情况下这个参数为NULL,但是如果活动被回收前有通过onSaveInstanceState()方法保存数据,我们可以通过相应的取值方法将数据取出。
Tips
官方文档中提到,即使没有主动采取数据保存,Activity的某些状态也会由预设
onSaveInstanceState()
实例还原。具体来说,预设实例会针对页面配置中的每一个View调用对应的onSaveInstanceState()
方法,UI中可见的变更都会自动保存,并在Activity重新构建时还原(如果组件没有ID,则系统无法储存其状态)。如果想要禁用自动储存,只需要将android:saveEnabled设为”false”。
一些活动会重新构建的特殊情况
当某些系统设置在程序运行阶段进行变更时(例如:屏幕方向、键盘可用性、语言)。针对这些情况应该考虑到数据存储和恢复。
结语
好想出去玩!