Activity的生命周期分析

/ 0评 / 0

本篇博客将详细分析下Activity的生命周期,一部分是典型情况下的生命周期,是指在用户的参与的情况,另一部分则是Activity被系统回收或者由于当前设备的Configuration发生改变而导致的Activity被销毁重建,两种情况下的情况有所不同。

典型情况下的生命周期分析

activity_lifecycle

在正常情况下,Activity会经历如上图中的生命周期。

1、onCreate()方法是Activity生命周期的第一个方法,表示Activity正在被创建,我们可以在这个方法里面做些初始化的工作,比如调用setContentView去加载界面等。

2、onStart()方法表示Activity已经可见了,但是还无法和用户进行交互。

3、onResume()方法表示Activity获取了焦点,可以与用户进行交互。

4、onPause()方法表示Activity部分不可见,比如即将跳转到其他Activity,这里可以做一点轻量级的回收工作,不能太耗时,不然会影响新Activity的显示。

5、onStop()方法表示Activity完全不可见。这里也可以做点稍微重量级的回收工作,同样不能太耗时。

6、onDestroy()方法表示Activity即将被销毁,我们可以在这里进行回收工作。

7、onRestart()表示Activity正在重新启动,一般是当Activity从不可见变为可见的时候被调用。

从整个生命周期来说,onCreate()方法和onDestroy()方法是配对的,分别标识着Activity的创建和销毁,onStart()和onStop()是配对的,分别标识着Activity的可见与不可见,onResume()和onPause()是配对的,分别标识着Activity是否能与用户进行交互。上面三对除了这些区别在实际使用中没有其他明显区别。

异常情况下的生命周期分析

异常情况包括用户配置发生改变Activity被销毁然后重建,比如横竖屏切换,或者是系统资源不足导致低优先级的Activity被杀死,这种情况不好模拟,不过和前面的情况差不多。就用前面的一种情况来介绍异常情况下的生命周期。

在默认情况下,如果我们的Activity不做特殊的处理,那么系统配置发生改变,Activity会被销毁然后重建。如下图

QQ截图20160506192215

我们可以看到,在旋转屏幕以后,系统回调了下面onSaveInstanceState(Bundle outState)和onRestoreInstanceState(Bundle savedInstanceState)这两个函数。

具体分析:当旋转屏幕,Activity被销毁的时候,onPause()和onStop()、onDestroy()会被调用,同时由于Activity是在异常情况下被终止的,所以系统会回调onSaveInstanceState()来保存当前Activity的状态,我们也可以在这里面保存需要的信息到onSaveInstanceState(Bundle outState)的参数中,当Activity被系统重建的时候,这个参数会被传递给onRestoreInstanceState(Bundle savedInstanceState)和onCreate()方法。这样我们就可以获取Activity被销毁前界面上的数据,然后重新设置到界面上。

这个在onSaveInstanceState的说明中可以看到:

/**

* Called to retrieve per-instance state from an activity before being killed

* so that the state can be restored in {@link #onCreate} or

* {@link #onRestoreInstanceState} (the {@link Bundle} populated by this method

* will be passed to both).

*

* <p>This method is called before an activity may be killed so that when it

* comes back some time in the future it can restore its state. For example,

* if activity B is launched in front of activity A, and at some point activity

* A is killed to reclaim resources, activity A will have a chance to save the

* current state of its user interface via this method so that when the user

* returns to activity A, the state of the user interface can be restored

* via {@link #onCreate} or {@link #onRestoreInstanceState}.

......

 

* <p>If called, this method will occur before {@link #onStop}. There are

* no guarantees about whether it will occur before or after {@link #onPause}.

*/

 

通过测试我们也可以看到,在onCreate和onRestoreInstanceState中的确获取到了保存的数据,onCreate的参数可能为空,但是onRestoreInstanceState里面的参数一定不为空。

QQ截图20160506193749

关于保存和恢复View的状态,系统的工作流程是这样的,首先Activity被意外终止的时候,Activity会调用onSaveInstanceState()去保存数据,然后Activity会委托Window去保存数据,接着Window委托顶层容器DecorView去保存数据,DecorView会一一通知它的子元素来保存数据,这样整个界面的保存过程就完成了,比如你给一个TextView设置一段文本,当旋转屏幕以后,按理说,上面的文本会消失,可是实际却不是这样,那是因为TextView内部实现了onSaveInstanceState和onRestoreInstanceState,当Activity重建以后,会自动用保存的数据恢复界面。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注