Android Activity生命周期
生命周期
在android系统中,系统使用Task Stack(Back Stack)结构来存储管理启动的Activity对象。当一个新的Activity开始时,将会强加于堆栈的顶端并成为运行Activity状态。而之前的Activity总是被放置在这个Activity下面的堆栈中,并且不会被移动到前台直到新的活动退出为止。
Activity从开始到结束经历各种状态。从一个状态到另一个状态的转变,从无到有再到无,这样一个过程中所经历的各个状态就叫做生命周期。Activity拥有自己的生命周期,而它的意义就在于,当我们对当前的界面进行展示的过程中,本身也会经历各个阶段去准备和处理当前的activity,然后展示给用户,而开发者为了界面上一些炫酷的效果与功能,做一些特殊处理时,就离不开这些生命周期。
下图中展示了activity的重要的状态改变路径。矩形中的代表你可以在活动在两种状态间改变时你可以实现的回调方法去执行想要的操作。而带有颜色的椭圆形代表着activity的主要状态。
方法 | 描述 | 用途(以当前界面播放视频为例) | 下一个方法 |
---|---|---|---|
onCreate() | 当Activity第一次创建时调用。该方法(如果有)会提供给你一个包含之前活动的冻结状态信息bundle包。 | 进行一系列初始化操作,如:创建View,加载视频数据等。 | onStart() |
onRestart() | 当Activity被停止后调用,在重新开始之前 | 当活动停止后重新启动该活动时调用(不常用),针对停止后重启操作。 | onStart() |
onStart() | 当Activity被展示在用户眼前时调用。如果活动出现在前台紧接着是onResume(),如果活动直接隐藏则紧接着是onStop()。 | 该方法也不常用。 | onResume() or onStop() |
onResume() | 当Activity将开始与用户进行交互时调用。在这个时间点你的活动将会在活动堆栈的顶端,用户输入将会访问它。 | 暂停后恢复我们会在该方法中进行一些操作,例如视频继续播放。 | onPause() |
onPause() | 当系统将要恢复一个之前的活动。这是一个有代表性的常常用于提交未被存储的改动信息为持久数据,停止动画和消耗CPU的东西等。实现该方法必须要特别的迅速,因为在此方法返回之前,下一个活动将不会恢复。如果活动将返回到前台则接下来调用onResume(),如果要隐藏到用户看不见的地方时,则调用onStop(); | 该方法十分重要,用来做信息持久化存储操作以及停止消耗CPU资源操作,如记录视频播放进度时间,以及暂停视频播放操作等。 | onResume or onStop() |
onStop() | 当另一个活动被恢复且完全覆盖该活动,而该Activity将不在展示给用户时调用。这种情况将发生在一个新的活动将被开始,一个退出的活动将被恢复,又或者该活动将要被销毁。如果该活动将恢复与用户交互则调用onRestart(),如果该活动将被销毁则调用onDestory()。 | 界面将会隐藏或销毁,做一些重要信息或未被存储的信息的存储操作。但也不要太耗时。如存储用户信息等操作,以及用户此次观看的视频地址以及时间,便于下次打开该界面时继续播放。 | onRestart() or onResume() |
onDestory() | Activity被销毁钱最后一个被调用的方法。这个方法将会发生因为活动将会结束(在活动中调用finish()方法,或者系统临时销毁该实例节约空间。你可以使用isFinishing()方法区别这两种场景)。 | 界面将要销毁,释放一些实例节约空间,如置空List集合等。 |
阶段状态
一个Activity从本质上讲拥有4种状态:
- 运行:如果当前的activity在前台界面上时(堆栈顶端)。
- 暂停:如果activity被另一个非全屏活动强占焦点并覆盖时(如弹窗dialog),它将会暂停。一个暂停的活动也是完全活跃的(它的所有的状态和成员信息将会保留,但activity本身将不会再依附于WindowsManager了),在内存极度缺乏的状态会被系统杀死。
- 停止:如果activity完全被另一个全屏活动遮挡住时,它将会停止。该活动也仍保留全部的状态和成员信息,但将会被隐藏起来不再展示给用户,并且当内存在其他地方被需要时该活动就将会被系统杀死。
- 重启:如果activity处于暂停或者停止状态,系统将会在内存中终止该活动无论是结束活动或者杀死进程。当它再一次展示给用户时,它必须是完全重启并且恢复到之前的状态。
状态转换
上图中我们可以看到Activity在生命周期状态进行转换的过程中,activity本身是在什么时候调用的onSaveInstanceState()方法与onRestoreInstanceState()方法来进行重要信息的存储与恢复的。因为在蜂巢版本之前onSaveInstanceState()方法只有在activity异常退出时才会调用,所以我们应该在onPause()方法中进行信息持久化存储的操作,在蜂巢之后的版本,生命周期就可以正常的调用onSaveInstanceState()方法来进行信息持久化存储的操作了。
如果文章对你有所帮助的话,请点个推荐或者关注吧。也希望你能够养成分享的习惯,从而去帮助其他人。