这个过程看起来对用户是透明的,并不会知道这个过程的发生,看起来如同1的执行顺序,不同的是如果保存有系统被清除出内出时的信息,会在调用时,系统以参数的形式给出,而1中的参数为null。
管理Activity生命周期
这里说是管理Activity的生命周期,更确切的说应该是参与生命周期的管理,因为Android系统框架已经很好的管理了这其中的绝大部分,应用开发者要做的就是在Android的框架下,在Activity状态转换的各个时点上,做出自己的实现,而实现这些要做的只是在你的Activity子类里面Override这些Activity的方法即可。
下图是Activity生命周期相关的方法。
Activity的实例化与启动
Activity实例化是由Android系统完成,在用户点击执行一个Activity或者另一个Activity需要这个Activity执行的时候,如果该Activity的实例不存在,Android系统都会实例化之,并在该Activity所在进程的主线程中调用该Activity的方法,实现Activity实例化时的工作。
所以,是系统实例化Activity时,Activity可做的自身初始化的时机。在这里可以实例化变量,调用Activity::setContentView()设置UI显示内容。
一般的,Activity实例化之后,就要启动该Activity,这样会在该Activity所在进程的主线程中顺序调用Activity的, 。回头看图一Activity的生命周期的典型时序,一般在所有的时序中都不是很特别的过程,所以一般不怎么实现。在暂停继续流程中很重要,后文再讲。
下图就是Activity实例化与启动的时序
这��从应用开发者角度来说明问题,暂不考虑Android内部的实现细节,所以各种动作的发起者统一用AndroidSystem来说明,而从Activity这边看过去,所有这些操作也都是异步的。
注意:
在Activity存续期内,只会被调用一次。如生命周期图中的时序6的情形其实是另外又启动了一个Activity的实例,并通过的参数传递进先前杀掉的Activtiy里保留的信息。
可因为已经STOPPED了,再次执行而被调用多次。
可因为Activity的PAUSED/RESUMED的不停转换,而被频繁调用。
Activity的暂停与继续
Activity因为被别的Activity遮住部分UI,并失去焦点而被打断暂停,典型的情况发生在系统进入睡眠或被一个对话框打断的情况。而在被暂停之前,系统会通过让Activity有保留被暂停前状态的时机。Activity可以在中,保存所做的修改到永久存储区,停止动画显示,等。onPause()里的操作必须简短并快速返回,因为在返回之前不会调入其他的Activity运行。
此时Activity因为还有部分UI显示,它通常与Window Manager的链接还在,所以一般UI的修改不需保留。即便在极端的情况下,PAUSED的Activity所在的进程被杀死,那也是极端情况,那种情况下,不可能使Activity的UI显示完整一致。
系统在被唤醒或者打断它的对话框消失之后,会继续运行,此时系统会调用Activity的方法。在方法中可以做与中相对应的事情。
下图是,一个Activity启动同一个进程内另外一个Activity的时序图。它能很好的说明,一个Activity启动时,与另外一个Activity之间的各种PAUSE/RESUME交互过程。
不过千万记得,PAUSE/RESUME是众多Activity状态转换中的一个子集,很多其他的场景也是要走这个过程的。
Activity的关闭/销毁与重新运行
Activity被STOP可能是完全被别的Activity覆盖掉了,也可能是用户显式的按了BACK或HOME键。Activity被Stop之前,它的方法会被提前调用,来做些Stop前的处理。如果处于STOPPED的Activity再次运行,它的onRestart()方法会被调用,这是区分其他调用场景,比较合适的实现处理的地方。
注意,因为处于PAUSED状态的Activity在内存极端不足的情况下,它所在的进程也可能被杀掉,这样在被杀掉前,不一定会被调用,所以是比更合适的保留信息到永久存储区的时机。
Activity被销毁可能是显式的按了BACK键,也可能是处于PAUSED或STOPPED状态,因为内存不足而被杀掉的。还有种情况是配置信息改变(比如屏的方向改变)之后,根据设置需要杀掉所有的Activity(是否关闭还要看Activity自己的配置),再重新运行他们。
被系统隐式杀死的Activity,在被杀死(调用)之前,一般的会调用保留该Activity此时的状态信息。该方法中传入Bundle参数,可在此方法中把此时的状态信息写入,系统保留这这些系统。而当该Activty再次被实例化运行时,系统会把保留在Bundler的信息再次以参数形式,通过方法传入。