Activity生命周期(Activity Lifecycle)

在系统中,Activities 被作为一个 activity 栈来管理。当一个新的 activity 启动是,它被压入栈顶并成为运行中的 activity ——前一个 activity 将被置于它的下面( 栈中位置 ),并且只要新的activity 存在,旧的 activity 就不会到前台运行。

一个activity 本质上有以下四种状态:

  • 如果一个activity 处于屏幕上前台运行(在栈顶),则称其为 活动 运行 状态。
  • 如果一个activity 失去了焦点但还是可见的(也即是,一个新的非全屏显示的或透明的 activity 出现在你的 activity 的顶上),它将处于 暂停 状态。一个暂停中的activity 仍然是活着的(它维护着 (activity) 所有的状态和成员信息并且保留着与窗口管理器 (window manager) 的联系),但是当系统处于一个极低的内存状态时可以被杀死。
  • 如果一个activity 被另一个 activity 完全遮盖,则处于 停止 状态。它仍然维护着(activity) 所有的状态和成员信息,但是,它对于用户不再是可见的因此它的窗口被隐藏并且经常因为其他地方需要内存而被系统杀死。
  • 如果一个activity 处于暂停或停止状态,系统可以通过询问是否结束或简单的杀死进程来将其从内存中终止掉。当它重新显示给用户时,它需要完全重新启动然后恢复到之前的状态。

下图显示了一个Activity 的重要状态的路径。方框内表示的是你可以用来当 Activity 在不同状态之间切换是实现一些操作的回调函数。有颜色的椭圆表示 Activity 可以处于的主要一些状态。

当监视 activity的状态时,有三个关键的循环是需要注意的:

  • 整个的生命周期( entire lifetime ) 开始与调用onCreate(Bundle) 方法,最后结束与 onDestroy() 方法的调用。 Activity 将在 onCreate() 中完成所有的“全局”设置,然后在 onDestroy() 中释放所占有的全部资源。比如,如果程序有一个从网络上下载数据的后台线程,那就需要在 onCreate() 创建这个线程并在 onDestroy() 中停止线程。
  • 一个activity 可访问周期( visible lifetime ) 开始于onStart() 的调用,然后一直到一个正确的 onStop() 调用而结束。这期间用户可以在屏幕上看到这个 activity ,尽管它可能不在前面同用户进行交互。在上述两个方法里,你可以维护让 activity 向用户显示所需要的资源。比如,你可以在 onStart() 中注册一个 BroadcastReceiver 来监视冲击你的 UI 的变化,而当你所显示的东西不再为用户所看到是在 onStop() 中取消注册。 onStart() onStop() 方法可以随着 activity 对用户的的可访问和隐藏被多次的调用。
  • 一个activity 可视周期( foreground lifetime ) 开始于onResume() 的调用,然后一直到一个正确的 onPause() 调用而结束。在此期间这个 activity 处于所有 activity 的最前面并同用户进行交互。一个 activity 可以频繁地在恢复和暂停状态之间运行——比如当设备进入休眠状态,或当一个 activity 的结果被发送出去,又或一个新的 intent 被发送——所以应尽量减少这些方法里的代码量。

Activity的整个的生命周期被定义成以下的一些方法。所有这些都是你可以用来重写以实现在 activity 的状态改变时完成某些特定工作的 hook(?) 。所有的 activities 都会实现 onCreate(Bundle) 来完成初始化设置;许多也会实现 onPause() 来提交数据的变动,要不就是为停止与用户的交互做准备。当实现这些方法时,你应该总是向上从父类中调用。

通常来说,一个activity 的生命周期的运转过程是这样的:

注意上表中“是否可被杀死”一列——对于这些标记为是的方法,当它返回后,持有这个activity 的进程可能会在未执行其它任何代码的情况下随时被系统杀死。鉴于此,你应该使用 onPause() 方法来将所有的持久化数据(比如用户编辑内容)保存起来。此外, onSaveInstanceState(Bundle) 方法是在将 activity 转为后台 (background) 状态之前调用,以来使你将所有 activity 的动态实例的状态保存到传进来的 Bundle 中,使得这个 activity 要被再度创建时可以在 onCreate(Bundle) 中接收到。可以查阅 Process LifeCycle 部分的内容以了解更多关于进程的生命周期是如何与它所持有的 activity 绑定起来的。注意,将持久化数据在 onPause() 中而非 onSaveInstanceState(Bundle) 中保存,是因为后者不是生命周期的回调函数,所以它不会在其文档中生命的任何情况中调用。

请注意这些语法在HONEYCOMB 版本中发生一些与之前版本不同的细小变化。从 Honeycomb 开始,当 onStop() 返回时,程序是不能够被杀死的。这也将影响到 onSaveInstanceState(Bundle) 被调用(它可以在 onPause() 之后被安全地调用,并且允许程序在 onStop() 保存持久化状态之前处于安全的等待状态。

对于那些没有被标记为可杀死的方法,activity 所在的进程不可以在方法被调用、运行和返回之后被杀死。因此一个 activity 只有在比如 onPause() 之后和 onResume() 之前处于可被杀死状态。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值