Activity在运行的过程中,是由Activity栈来管理的,当前Activity位于栈顶,所以说一个Activity在生命周期过程中一定会有时处于栈顶(活动状态),有时处于栈中其它位置(非活动状态)。
Activity在生命周期中只会有三种状态:
-
Resumed:此时该Activity可视并且可以获得用户焦点,该状态也叫“运行时”状态
-
Paused:此时另一个Activity位于屏幕前景并可以获得焦点,但是另一个Activity并没有完全覆盖当前Activity,也就是说当前Activity还有一部分是可视的,此时该Activity并么有被销毁,但是如果需要,系统会杀死它。
-
Stoped:此时Activity完全不可视,当前Activity也没有被销毁,但是如果需要,系统会杀死它。
在我们编程过程中,上述的三个状态主要是由如下几个回调方法体现的:
-
onCreate(Bunble savedStatus):当Activity第一次被创建时会调用它。在这个方法中,我们通常会给Activity设置布局、给list绑定数据以及实现一些时间监听等工作,该函数的参数为Activity前一个状态(当然,前提是这个状态被捕获了)。此状态下系统不会终止该Activity。
-
onStart():当Activity对用户可视时调用该函数。如果Activity回到前景则后接onResume();若果Activity变得隐藏则后接onStop()。此时系统不会终止该Activity。
-
onRestart():当Activity已经被停止,然后重新变得可视时会调用它,后接onStart()。此时系统不会终止该Activity。
-
onPause():这个很重要,当当前Activity启动另一个Activity时会调用它。通常我们在这里执行一些数据保存工作,这个函数应该保证很快就能执行完毕,因为只有当这个函数返回后,被启动Activity才能被运行。若Activity回到前景则后接onResume();若Activity变得不可视,则后接onStop()。
-
onStop():当当前Activity完全被另一个Activity覆盖变得不可见的时候会调用这个函数。若Activity重新变得可视则后接onRestart();若Activity终止则后接onDestory()。此时系统可能会杀死该Activity。
-
onDestory():销毁时候会调用,这是一个Activity的最后调用,可能有finish()触发,也有可能是因为系统资源不足而被系统杀死。
注意,上面有些函数有可能不会被执行,如前所述,有些函数执行完毕后,系统有可能会将Activity直接杀死,这种情况下就不会调用后续的函数,所以我们在编程过程中要选择在适当的地方做适当的工作,有点废话,这只能靠以后的经验判断了。
下面用一个来自于官方文档的图来更清晰的展示这几个函数的调用时机及相互转换:
关于onCreate(Buble savedStatus)的说明
参数Buble存储了Activity的前一个状态。当调用onStop()之后有俩种情况。一种是系统没有杀死该Activity,这是用户按了返回键,Activity变得重新可视,这时会调用onRestart()->onStart()等方法使得Activity能够恢复到先前的状态,为什么能恢复呢?那是因为这是Activity并没有被销毁,依然占有内存,所以系统可以帮我们自动恢复,无需我们手动恢复。但是另一种情况是如果系统由于资源有限已经将Activity销毁,这时用户按了返回键,那么系统就不能帮我们自动恢复了。如果这时候我们还想恢复怎么办呢?有一种方法,那就是重写onSavedInstance()方法,系统会在可能销毁对象的时候(在调用onPause()、onStop()之后,也就是系统可能销毁Activity之前会调用)调用这个方法我们利用这个方法将系统状态存储到一个Buble对象中,这个对象也就是传给onCreate()方法的Buble对象,恢复时,我们利用Buble去恢复即可。(其实还有一个方法可以用来恢复,那就是onRestoreInstanceStatus()方法)当然,如果我们没有存储状态,那么这个Buble一定是null,就像第一次创建该对象之时那样。如下图:
理解Activity的生命周期很重要,我们可以自己写一个简单的例子去验证一下哪些情况下会调用哪些方法。