1.管理Activity的生命周期
无论是正在运行的Activity还是没有运行的Activity,它们都接受Android的框架管理,这使得Activity处于不同的生命周期。
①Activity的3种状态
通过回调方法来管理Activity的生命周期对于开发一个健壮并且灵活的应用程序是非常关键的。Activity的生命周期直接影响到它与其他Activity,任务以及栈的关系。
Activity存在3种状态,分别是resumed,paused和stopped。
resumed:指Activity在屏幕前台并且拥有用户焦点的状态,这个状态有时也称为“正在运行”
paused:指另一个Activity在屏幕前台并且拥有用户焦点的状态,但这个Activity仍然可见,即另一个Activity在前一个Activity之上,而前一个Activity又是可见的并且部分透明或者没有覆盖整个屏幕。一个处于paused状态的Activity是完全存活的(Activity对象村中被保留,它维护所有状态和成员信息,并依然依附窗口管理器),但是在内存极低时将被系统杀掉。
stopped:指前一个Activity被另一个Activity完全遮蔽(前一个Activity当前在后台中)。一个处于stopped状态的Activity仍然是存活的(这个Activity对象在内存中被保留,它维护所有状态和成员信息,但没有依附窗口管理器)。然而,它却不再显示给用户,并且在内存极低时会被系统杀掉。
如果一个Activity处于paused或stopped状态,那么系统会从内存中丢掉它,这可以通过调用它的finish()方法来实现,或者简单一点,通过杀掉它的进程来实现。当Activity重新打开(在它结束或者被杀掉之后)时,它就必须被重新创建。
②实现Activity的生命周期回调
当Activity发生状态转变时,它会通过回调方法来得到通知,我们可以重写所有这些回调方法完成适当的工作。当Activity状态发生改变时,Activity的框架包含每一个基本的生命周期方法,如下列代码所示:
@Override public void onCreate(Bundle savedInstanceState){ //指示这个Activity正在被创建 super.onCreate(saveInstanceState); //完成一些任务 } @Override protected void onStart(){ //这个Activity正在变为可见 super.onStart(); //完成一些任务 } @Override protected vodi onResume(){ //这个Activity已经变为可见 //现在是resumed状态 super.onResume(); //完成一些任务 } @Override oritected void onPause(){ //另一个Activity获得焦点而且当前的Activity失去焦点 //也就是当前Activity被另一个Activity部分或者全部覆盖 //当前Activity失去焦点的时候调用 //这个Activity现在处于paused状态 super.onPause(); //完成一些任务 } @Override protected void onStop(){ //这个Activity不再可见的时候调用 //当前Activity处于stopped状态 super.onStop(); //完成一些任务 } @Override protected void onDestory(){ //这个Activity已经被销毁 super.onDestory(); //完成一些任务 }
建议:通常,在实现这些生命周期方法时,必须先调用超类的实现(比如调用super.XXX)。综上所述,以上这些方法定义了Activity的整个生命周期。通过实现这些方法,我们就能监视Activity生命周期中的3个嵌套循环,具体如下所示。
Activity的整个生命周期发生在调用onCreate()和调用onDestory()之间。在onCreate()中,Activity应该设置“全局”状态(比如定义布局),并且在onDestory()中释放其余资源。例如,如果Activity有一个后台运行的线程从网络上下载数据,那么它应该在onCreate()中创建这个线程,并且在onDestory()停止该线程。
Activity的可见生命周期发生在调用onStart()和调用onStop()之间。在这个过程中,用户可以看到这个Activityd在屏幕中并且可以与之交互。例如,当一个新Activity启动并且前一个Activity不再可见的时候,onStop()就被调用了。在这两个方法之间,可以维护需要显示给用户的Activity资源。例如,可以在onStart()方法中注册一个广播接收器去监视影响UI的变化,当用户看不到显示的东西时,则在onStop()注销它。在Activity的整个生命周期中,当Activity在可见和隐藏之间切换时,系统就会多次调用onStart()和onStop()方法。
Activity的前台生命周期发生在调用onResume和调用onPause()之间。需要说明的是,在这期间,Activity在屏幕中所有其他Activity的前面并且拥有用户焦点。一般情况下,Activity可以被频繁转换。例如,当设备休眠或者显示一个对话框时,onPause()就会被调用。
对于以上知识,为了方便读者理解并理顺它们之间的内在关系,我们用一张图来直观地描述,如下图:
上图为Activity生命周期的演化过程
顺便也列出一张表,描述了在Activity的整个生命周期里定位的每一个回调方法以及其细节,以及回调方法完成后系统是否可以停止这个Activity等。
方法 |
描述 |
调用后是否可以被杀掉 |
下一步操作 |
onCreate() |
当Activity第一次被创建时调用。此处可以做所有的一般静态设置,比如创建视图,绑定列表数据等。 如果状态被捕捉,并且此状态存在的话,这个方法传递一个包含这个Activity的前状态的Bundle对象。 |
否 |
onStart() |
onRestart() |
Activity被停止后,再次启动之前调用。 |
否 |
onStart() |
onStart() |
在Activity对用户可见之前被调用。 如果这个Activity来到前台,那么下一步操作是调用OnResume()。 如果被隐藏,则下一步操作是调用onStop()。 |
否 |
onResume()或者onStop() |
onResume() |
在Activity开始与用户交互之前被调用。在这里,该Activity位于Activity栈顶,开始与用户交互。 需要注意的是,此时当前Activity处于resumed状态,这个状态下Activity是可见的。 |
否 |
onPause() |
onPause() |
当系统正在恢复另一个Activity的时候被调用。这个方法通常用于提交未保存的数据,停止动画以及可能 消耗CPU的事情等。这些应该高效地完成,因为下一个Activity在这个方法没有返回之前不会被运行。如果Activity回到前台,则下一步操作为调用onResume()。如果Activity变得不可见,则调用onStop(). |
是 |
onResume()或者onStop() |
onStop() |
当Activity对用户不再可见的时候调用。这会发生,是因为它正在被销毁或者另一个Activity(可以是已经存在的或者新的)被运行并且覆盖了它。 如果Activity恢复与用户交互,则下一步操作是调用onRestart(),如果这个Activity消失,则调用onDestory()。 |
是 |
onRestart()或者onDestory() |
onDestory() |
该Activity被销毁之前调用。这个Activity收到的最终调用。它可以是因为Activity正在结束(调用finish()),或者是因为心痛为保护空间而面临销毁这个Activity的实例而调用。可以通过isFinishing()方法区分这两种情况。 |
是 |
无 |