Android---Activity生命周期状态
Activity生命周期:
一个activity 主要有三个状态:
·当在屏幕前台时(位于当前任务堆栈的顶部),它是活跃或运行的状态。它就是相应用户操作的activity 。
·当它失去焦点但仍然对用户可见时,它处于暂停状态。即是:在它之上有另外一个activity 。这个 activity 也许是透明的,或者未能完全遮蔽全屏,所以被暂停的 activity 仍对用户可见。 暂停的activity 仍然是存活状态 (它保留着所有的状态和成员信息并连接至窗口管理器),但当系统处于极低内存的情况下,仍然可以杀死这 个activity 。
·如果它完全被另一个activity 覆盖是,它处于 停止状态。它仍然保留所有的状态和成员信息。然而它不在为用户可见,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个activity 。
如果一个activity 处于暂停或停止状态,系统可以通过要求它结束(调用它的 finish() 方法)或直接杀死它的进程来将它驱出内存。当它再次为用户可见的时候,它只能完全重新启动并恢复至以前的状态。
当一个activity 从这个状态转变到另一个状态时,它被以下列 protected 方法所通知:
voidonCreate(BundlesavedInstanceState)
voidonStart()
voidonRestart()
voidonResume()
voidonPause()
voidonStop()
voidonDestroy()
你可以重载所有这些方法以在状态改变时进行合适的工作。所有的activity 都必须实现 onCreate() 用以当对象第一次实例化时进行初始化设置。很多情况下我在activity 会中实现 onPause() 以提交数据变化或准备停止与用户的交互。
调用父类
所有 activity 生命周期方法的实现都必须先调用其父类的版本。比如说:
protectedvoidonPause(){
super.onPause();
...
}
总得来说,这七个方法定义了一个activity 完整的生命周期。实现这些方法可以帮助你监察三个嵌套的生命周期循环:
·一个activity 完整的生命周期自第一次调用onCreate()开始,直至调用onDestroy()为止。activity 在 onCreate()中设置所有“ 全局 ” 状态以完成初始化,而在 onDestroy()中释放所有系统资源。比如说,如果activity 有一个线程在后台运行以从网络上下载数据,它会以 onCreate()创建那个线程,而以 onDestroy()销毁那个线程。
·一个activity 的 可视生命周期自onStart()调用开始直到相应的onStop()调用。在此期间,用户可以在屏幕上看到此activity ,尽管它也许并不是位于前台或者正在与用户做交互 。在这两个方法中,你可以管控用来向用户显示这个 activity 的资源。比如说,你可以在 onStart()中注册一个BroadcastReceiver来监控会影响到你UI 的改变,而在 onStop()中来取消注册,这时用户是无法看到你的程序显示的内容的。onStart()和onStop()方法可以随着应用程序是否为用户可见而被多次调用。
·一个activity 的 前台生命周期自onResume()调用起,至相应的onPause()调用为止。在此期间,activity 位于前台最上面并与用户进行交互 。 activity 会经常在暂停和恢复之间进行状态转换 ── 比如说当设备转入休眠状态或有新的 activity 启动时,将调用 onPause()方法。当activity 获得结果或者接收到新的 intent 的时候会调用 onResume()方法。因此,在这两个方法中的代码应当是轻量级的。
下图展示了上述循环过程以及activity 在这个过程之中历经的状态改变。着色的椭圆是 activity 可以经历的主要状态。矩形框代表了当 activity 在状态间发生改变的时候,你进行操作所要实现的回调方法。
下表详细描述了这些方法,并在activity 的整个生命周期中定位了它们。
方法 | 描述 | 可被杀死 | 下一个 | ||
在activity 第一次被创建的时候调用。这里是你做所有初始化设置的地方 ── 创建视图、绑定数据至列表等。 如果曾经有状态记录(参阅后述SavingActivityState 。),则调用此方法时会传入一个包含着此activity 以前状态的包对象做为参数。 总继之以onStart()。 | 否 | onStart() | |||
在activity 停止后,在再次启动之前被调用。 总继之以onStart()。 | 否 | onStart() | |||
当activity 正要变得为用户所见时被调用。 当activity 转向前台时继以 onResume(),在activity 变为隐藏时继以 onStop()。 | 否 | onResume() | |||
在activity 开始与用户进行交互之前被调用。此时 activity 位于堆栈顶部,并接受用户输入。 继之以onPause()。 | 否 | onPause() | |||
当系统将要启动另一个activity 时调用。此方法主要用来将未保存的变化进行持久化,停止类似动画这样耗费 CPU 的动作等。这一切动作应该在短时间内完成,因为下一个 activity 必须等到此方法返回后才会继续。 当activity 重新回到前台是继以 onResume()。当activity 变为用户不可见时继以 onStop()。 | 是 | onResume() | |||
当activity 不再为用户可见时调用此方法。这可能发生在它被销毁或者另一个 activity (可能是现存的或者是新的)回到运行状态并覆盖了它。 如果activity 再次回到前台跟用户交互则继以 onRestart(),如果关闭activity 则继以 onDestroy()。 | 是 | onRestart() | |||
在activity 销毁前调用。这是 activity 接收的最后一个调用。这可能发生在 activity 结束(调用了它的 finish() 方法)或者因为系统需要空间所以临时的销毁了此acitivity 的实例时。你可以用 isFinishing() 方法来区分这两种情况。 | 是 | nothing |
请注意上表中可被杀死一列。它标示了在方法返回后,还没执行activity 的其余代码的任意时间 里,系统是否可以杀死包含此activity 的进程。三个方法( onPause()、onStop()和 onDestroy() )被标记为“ 是 ” 。 onPause()是三个中的第一个,它也是唯一一个在进程被杀死之前必然会调用的方法── onStop()和onDestroy()有可能不被执行。因此你应该用onPause()来将所有持久性数据(比如用户的编辑结果)写入存储之中。
在可被杀死一列中标记为“ 否 ” 的方法在它们被调用时将保护 activity 所在的进程不会被杀死。所以只有在 onPause()方法返回后到 onResume() 方法被调用时,一个activity 才处于可被杀死的状态。在 onPause()再次被调用并返回之前,它不会被系统杀死。
如后面一节进程和生命周期 所述,即使是在这里技术上没有被定义为“ 可杀死 ” 的 activity 仍然有可能被系统杀死 ── 但这仅会发生在实在没有其它方法的极端情况之下。
保存activity 状态
当系统而不是用户自己出于回收内存的考虑,关闭了一个activity 之后。用户会期望当他再次回到那个 activity 的时候,它仍保持着上次离开时的样子。
为了获取activity 被杀死前的状态,你应该为 activity 实现 onSaveInstanceState() 方法。Android会调用此方法在 activity 有可能被销毁之前(即 onPause()调用之前)。它会将一个以名称- 值对方式记录了 activity 动态状态的 Bundle 对象传递给该方法。当activity 再次启动时,这个 Bundle 会传递给 onCreate()方法和随着onStart()方法调用的onRestoreInstanceState() ,所以它们两个都可以恢复捕获的状态。
与onPause()或先前讨论的其它方法不同,onSaveInstanceState()和onRestoreInstanceState()并不是生命周期方法 。它们并不是总会被调用。比如说,Android 会在 activity 易于被系统销毁之前调用 onSaveInstanceState(),但用户动作(比如按下了BACK 键)造成的销毁则不调用 。在这种情况下,用户没打算再次回到这个 activity ,所以没有保存状态的必要。
因为onSaveInstanceState()不是总被调用,所以你应该只用它来为activity 保存一些临时的状态,而不能用来保存持久性数据。而是应该用 onPause()来达到这个目的。
协调activity
当一个activity 启动了另外一个的时候,它们都会经历生命周期变化。 一个会暂停乃至停止,而另一个则启动。这种情况下,你可能需要协调好这些activity :
生命周期回调顺序是已经定义好的,尤其是在两个activity 在同一个进程内的情况下:
1.调用当前activity 的 onPause()方法。
2.接着,顺序调用新启动activity 的 onCreate()、onStart()和onResume()方法。
3.然后,如果启动的activity 不再于屏幕上可见,则调用它的 onStop()方法。
总之:1、Activity 从创建到进入运行态所触发的事件 onCreate()-->onStart-->onResume()
2、从运行态到停止态所触发的事件 onPause()--->onStop()
3、从停止态到运行态所触发事件 onRestart()-->onStart()--->onResume()
4、从运行态到暂停态所触发事件 onPause()
5、从暂停态到运行态所触发事件 onResume()
还有就是当切换横竖屏幕时也会发生生命周期事件: