在过去的应用程序开发中,读者大多数已经了解了Activity生命期中的几个主要状态,并知道如何在这些状态中做不同的事情。但多多少少还是存在一些疑惑,比如start和stop状态从代码的意义上来讲,差别到底在哪里。尽管你可能会说:"stop代表了Activity的停止,而start代表了Activity的开始",那么,问题是"开始"和"停止"的差别又在哪里?诸如此类,本节就来揭示这些不同状态背后所隐藏的代码级别的差别。
首先,不同的状态对于应用程序开发者来讲是通过不同的回调函数来区分的,因此,下面先列出所有和状态有关的回调函数,如下表所示。
Activity中所有和状态相关的回调函数:
回调函数名称 | 使用场合 |
onCreate() | Activity实例被创建后第一次运行时 |
onNewIntent() | 有两种情况会执行该回调: ● Intent的Flag中包含CLEAR_TOP,并且目标 Activity已经存在当前任务队列中。 ● Intent的Flag中包括SINGLE_TOP,并且目标 ● Activity已经存在当前任务队列中。 前者和后者的区别在于,举例如下:当前任务队列 为ABCD, 此时目标Activity为B,那么前者会把队列改变为 AB,而后者则会改变为ABCDB; 但假设当前为ABCD,目标为D,前者则会改变为 ABCD,后者则还是ABCD,而不会重新创建D对象, 即SINGLE_TOP只对目标在top上时才有效 |
onStart() | Activity从stop状态重新运行时 |
onRestore InstanceState(Bundle savedInstance) | 与onPostCreate()相同,只是先于onPostCreate()调用 |
onPostCreate() | 如果Activity实例是第一次启动,则不调用,否则, 以后的每次重新启动都会调用 |
onResume() | Activity继续运行时 |
onSave InstanceSate(outState) | 与onPause()相同,只是会先于onPause()调用 |
onPause() | Activity暂停时被调用。导致暂停的原因除了 onStop()中描述四个原因外,还包括一个,即当用 户长按“Home”键出现最近任务列表时,此时正在 运行的Activity将被执行onPause() |
onCreateDescription() | 仅在要停止Activity时调用,先于onStop() |
onStop() | 一般会导致变为stop状态的原因有以下几个: ● 用户按“Back”键后 ● 用户正在运行Activity时,按“Home”键 ● 程序中调用finish()后 ● 用户从A启动B后,A就会变为stop状态 |
onDestroy() | 当Activity被销毁时,销毁的情况包括: ● 当用户按下“Back”键后 ● 程序中调用finish()后 |
下面,按照AmS的调度过程重新总结以上回调函数在不同场合下的被调过程,如下表所示。
不同场合下回调函数被调用的顺序:
场合描述 | 回调过程 |
创建Activity对象并启动 | onCreate(); onStart(); onRestoreInstanceState(); onPostCreate(); onResume(); |
场合描述 | 回调过程 |
Activity对象已经存在并继续运行 | onStart(); onResume(): |
Activity对象已经存在,并且满足表 10-4中onNewIntent()的条件 | onNewIntent(); onStart(); onResume(); |
AmS中调用startPausingLocked() | onSaveInstance(); onPause(); |
AmS空闲时调用stopActivityLocked() | 如果没有暂停则先调用: onSaveInstance(); onPause(); 然后调用: onCreateDescprition(); onStop(); |
AmS空闲时调用destroyActivityLocked() | 如果没有暂停则先调用: onSaveInstance(); onPause(); 如果没有停止则继续调用: onCreateDescprition(); onStop(); 然后调用: onDestroy(); |
以上就是Activity不同生命期对应的回调函数的具体执行过程。