Activity是Android四大组件之首,其重要性不言而喻,Activity的生命周期更是我们了解Android工作机制的重中之重。我们一般将Activty的生命周期做两种情况下的理解,即正常情况和异常情况。
所谓正常情况下的生命周期,指的是在有用户参与的情况下,Activity所经过的生命周期的改变;
所谓异常情况下的生命周期,指的是Activity被系统回收或者由于设备的Configuration发生改变从而导致Activity被销毁重建。
接下来我们来依次深入了解一下这两种情况下Activity的生命周期。
正常情况下的生命周期分析
正常情况下Activity的生命周期如下图所示:
onCreate()
onStart()
onResume()
onPause()
onStop()
onDestroy()
onRestart()
【注意】:
(1)生命周期函数基本上是配对的,如 onCreate() 方法和 onDestroy() 方法、onStart() 方法和 onStop() 方法、onResume() 方法和 onPause() 方法等;
(2)当打开一个新的 Activity 时,旧 Activity 的 onPause() 方法会先于新 Activity 的 onResume() 方法执行;
(3)由于上一条,因此不能在 onPause() 方法中做太过好事的操作,较为耗时的操作应该尽量放在 onStop() 方法中执行,从而使新 Activity 尽快显示出来。
异常情况下的生命周期分析
开头说过,导致Activity生命周期异常的情况有两种:Activity的配置发生改变,以及Activity被系统回收。
情况1:资源相关的系统配置改变导致Activity被杀死并重建
Activity中有很多配置信息,如果这些信息发生改变,那么Activty就可能会被杀死并重建。但是,我们可以通过代码来干预这些配置,设置某些配置即使发生改变,Activity也不会被杀死。系统配置中有很多内容,如果当某项内容发生改变后,我们不想系统重新创建Activity,则可以在Manifest文件中给这个Activity指定configChanges属性,示例代码如下:
<activity
android:name=".ui.activity.LoginActivity"
android:configChanges="orientation|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize|stateVisible">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
android:configChanges 属性来禁止设置在横竖屏切换后被杀死并重建,只需要在Manifest文件的 <activity> 标签中添加 android:configChanges="orientation|keyboardHidden|screenSize"
更多的配置选项请参考下表:
【注意】:不同的配置选项之间可以通过“ | ”符号分隔。
如果我们不为Activity设置configChanges属性,那么当Activity被杀死重建之后,我们还能不能获取到之前的数据了呢?答案是可以的,我们可以通过Android系统为我们提供的两个方法 onSaveInstanceState() 和 onRestoreInstanceState() 来存储和取出数据。当Activity在异常情况下需要重新创建时,系统会默认为我们保存一些数据,如当前Activity的视图结构、文本框中用户输入的数据、ListView滚动的位置等。
onSaveInstanceState() 和 onRestoreInstanceState()
【注意】:
onSaveInstanceState() 在onStop()方法之前执行, onRestoreInstanceState()
onSaveInstanceState() 和 onRestoreInstanceState()
onCreate()
onSaveInstanceState() 和 onRestoreInstanceState() 两个方法。Android系统保存和回复View层次结构中的数据的方法使用了委托思想,其流程是这样的:首先Activity被异常终止时,Activity会调用 onSaveInstanceState()
情况2:资源内存不足导致低优先级的Activity被杀死
这里我们需要先了解一下Andorid系统中Activity的优先级分类,从高到低可以分为以下三类:
(1)前台Activity——正在和用户交互的(获取用户焦点的)Activity,优先级最高;
(2)可见但非前台Activity——用户可见但没有获取用户焦点的Activity;
(3)后台Activity——用户不可见、已经被暂停了的的Activity,优先级最低。
onSaveInstanceState() 和 onRestoreInstanceState()
【注意】:如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死,因此,一些后台工作不适合脱离四大组件而独立的运行在后台中,这样进程将很容易被杀死。比较好的方法是将后台工作放入Service中从而保证进程有一定的优先级,这样就不会轻易地被系统杀死。