Android中活动的生命周期

Activity的生命周期是安卓开发中很重要的一个点,也是在面试中经常会被问到的一点,属于需要好好了解的一部分知识

首先在这里安利一下Google官方的开发者文档,虽然是繁体中文但是大致上不影响阅读,可能需要科学上网——https://developer.android.google.cn/guide/components/activities/ ,在这里Google详细讲述了安卓活动相关的种种细节,希望在通过各种书籍视频学习时也一定要阅读这部分内容!

活动状态

在《第一行代码》第2版中将活动分为四种状态:

  1. 运行状态
  2. 暂停状态
  3. 停止状态
  4. 销毁状态

而在官方文档中,将活动分为三种状态:

  1. 已继续
  2. 已暂停
  3. 已停止

其实本质上相同,只是官方文档认为活动销毁后便不再算入生命周期。

当活动处在屏幕最前端且具有使用者焦点时,认为活动处于运行状态;当活动失去焦点,但仍然可见,即上层覆盖一个并不占用全屏幕的活动时进入暂停状态;当活动完全不可见(被另外一个活动完全遮挡)但仍存在于内存中时处于停滞状态。对于暂停或停止的活动,可以调用finish()方法销毁,使其在内存中清除。

活动的生命周期回调

Activity类定义了7个回调方法:

public class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 活动被创建时调用
}
@Override
protected void onStart() {
super.onStart();
// 活动由不可见变成可见时调用
}
@Override
protected void onResume() {
super.onResume();
// 当活动准备好与用户交互时调用(活动本身处于运行状态)
}
@Override
protected void onPause() {
super.onPause();
// 当另一个活动获得焦点时调用,在这个方法中将一些消耗CPU的资源释放,保存一些关键数据,但执行速度要快,不能影响到新的栈顶活动
}
@Override
protected void onStop() {
super.onStop();
// 当活动完全不可见时调用
}
@Override
protected void onDestroy() {
super.onDestroy();
// 程序销毁前执行
}
}

活动的生存期可以分为三部分:

完整生存期:onCreate()和onDestory()方法之间

可见生存期:位于onStart()和onStop()方法之间,在这个生存期内活动对于用户总是可见的,但有可能无法与用户交互(焦点不聚焦在本活动)

前台生存期:onResume()方法和onPause()方法之间所经历的就是前台生存期,这个时期活动总是可以与用户交互

下面是谷歌官方提供的活动生命周期的示意图:

活动被回收了怎么办?

如果想要在活动被回收后恢复活动需要使用onSaveInstanceState()方法,这个方法携带一个Bundle类型的参数,Bundle提供了一系列用于保存数据的方法,每个保存方法需要传入两个值——键(用于取回值)和需要保存的内容。

保存的数据如何恢复?

大家可能以及注意到在onCreate()方法中有Bundle类型的参数,在一般情况下这个参数为NULL,但是如果活动被回收前有通过onSaveInstanceState()方法保存数据,我们可以通过相应的取值方法将数据取出。

Tips

官方文档中提到,即使没有主动采取数据保存,Activity的某些状态也会由预设 onSaveInstanceState() 实例还原。具体来说,预设实例会针对页面配置中的每一个View调用对应的 onSaveInstanceState()方法,UI中可见的变更都会自动保存,并在Activity重新构建时还原(如果组件没有ID,则系统无法储存其状态)。

如果想要禁用自动储存,只需要将android:saveEnabled设为”false”。

一些活动会重新构建的特殊情况

当某些系统设置在程序运行阶段进行变更时(例如:屏幕方向、键盘可用性、语言)。针对这些情况应该考虑到数据存储和恢复。

结语

好想出去玩!

评论