Activity的生命周期
Activity的生命周期以及回调方法图:
一个Activity主要有三种状态:
1.当在屏幕前台时(位于Activity栈的顶部),他是活跃或运行状态。他就是响应用户操作的Activity。
2.当他失去焦点但仍然可见时,他处于暂停状态。即:在他之上有另外一个Activity,这个Activity也许是透明的,或者未能完全遮蔽全屏,所以被暂停的Activity仍对用户可见。暂停的Activity仍然保留着所有的状态和成员信息并连接至窗口管理器),但是当系统处于极低内存的情况下,仍然可以杀死这个Activity。
3.如果他完全被另一个Activity覆盖时,他处于停止状态。他仍然保留所有的状态和成员信息。然而他不再为用户所见,所以它的窗口将被隐藏,如果更高优先级的应用需要内存,则系统经常会杀死这个Activity。
在Activity生命周期中,如下方法会被系统自动回调。 是否可被杀死
1.onCreate(Bundle savedStatus):在Activity对象被第一次创建时调用,该方法只会被调用一次。 否
2.onStart():当Activity变得可见时调用该函数。当Activity转向前台时继以onResume(),在Activity变为隐藏时继以onStop()。 否
3.onResume():当Activity开始准备与用户交互时调用该方法。此时Activity位于堆栈顶部,并接受用户输入。 否
4.onPause():当系统即将启动另外一个Activity之前调用该方法。此方法主要用来将保存的变化进行持久化,停止类似动画这样消耗CPU的动作等。这一切动作应该在短时间内完成,因为下一个Activity必须等到此方法返回后才会继续。 是
5.onStop():当前Activity变得不可见时调用该方法。 是
6.onDestory():当前Activity被销毁之前将会调用该方法。 是
7.onRestart():当一个Activity再次被启动之前将会调用该方法。 否
你可以重载所有这些方法以在状态改变时进行合适的工作。所有的Activity都必须实现onCreate()用以当Activity对象第一次创建时进行初始化设置。很多情况下在Activity中重载onPause()已提交数据变化或准备停止与用户交互。
一个Activity完整的声明周期自第一次调用onCreate()开始,直至调用onDestory()为止。Activity在onCreate()中设置所有“全局”状态以完成初始化,而在onDestory()中释放所有系统资源。比如说,如果Activity有一个线程在后台运行以从网络上下载数据,它会以onCreate()创建那个线程,而以onDestory()销毁那个线程。
一个Activity的可视生命周期自onStart()调用开始直到相应的onStop()调用。在此期间,用户可以在屏幕上看到此Activity,尽管他也许并不是位于前台或正在与用户做交互。在这两个方法中,你可以掌控用来显示这个Activity的资源。比如说,你可以在onStart()中注册一个BroadCastReceiver来监控会影响到你UI的改变,而在onStop()中来取消注册,这时用户是无法看到你的程序显示的内容的。onStart()和onStop()方法可以随着应用程序是否为用户可见而被多次调用。
一个Activity的前台生命周期自onResume()调用起,至相应的onPause()调用为止。在此期间,Activity位于前台最上面并与用户进行交互。Activity会经常在暂停和恢复之间进行状态转换——比如说当设备转入休眠状态或有新的Activity启动时,将调用onPause()方法。当Activity获得结果或者接收到新的intent的时候会调用onResume()方法。因此,在这两个方法中的代码应该是轻量级的。
总之:
1.Activity从创建到进入运行态所触发的事件onCreate-->onStart-->onResume
2.从运行态到停止态所触发的事件onPause-->onStop
3.从停止态到运行态所触发的事件onRestart-->onStart-->onResume
4.从运行态到暂停态所触发的事件onPause
5.从暂停态到运行态所触发的事件onResume
下图有助于理解Activity的生命周期:
不难看出,其实这些方法都是两两对应的,onCreate创建与onDestroy销毁;onStart可见与onStop不可见;onResume可编 辑(即焦点)与onPause;这6个方法是相对应的,那么就只剩下一个onRestart方法了,这个方法在什么时候调用呢?答案就是:在 Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用 onCreate)方法;如果被onDestroy了,则是调用onCreate方法。
下面再通过一个比喻来看两个Activity的切换过程。
我们把Activity比作一本书,我们要看书,首先从书架上取出书(onCreate),然后放到桌上(onStart)(变得可见),接着打开书(onResume)(获得焦点,变得可编辑),这样我们就可以看书并可以在书本上写字了。
如果这时候我们要启动另一个Activity,也就是要看另一本书,首先我们放下手中的笔或者说合上书(onPause),然后从书架上拿下另一本书(书2:onCreate),然后把书本2放到桌上并打开(书2:onStart、onResume)。
如果书本1被书本2完全盖住了,即不可见了,就调用书本1的onStop;而如果书本2较小,没有完全盖住书本1,则不会调用。
我们还可以把书本1放回书架上,即onDestroy。
另外还有一点要注意,Activity在处于onPause、onStop、onDestory状态下,系统都可以销毁该Activity所在进程,所以我们在处理一些要保存的数据时,必须在onPause方法中进行,因为onPause是唯一一个在进程被杀死之前必然会调用的方法,onStop和onDestory方法不一定会被调用。因此应该用 onPause() 来将所有持久性数据(比如用户的编辑结果)写入存储之中。
注意是否可被杀死一列,他表示了在方法返回后,还没有执行Activity的其余代码的任意时间里,系统是否是可以杀死包含此Activity的进程。所以只有在onPause()方法返回后到onResume() 方法被调用时,一个activity才处于可被杀死的状态。在onPause()再次被调用并返回之前,它不会被系统杀死。