Android---Activity生命周期状态

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 的整个生命周期中定位了它们。

方法

描述

可被杀死

下一个

onCreate()

在activity 第一次被创建的时候调用。这里是你做所有初始化设置的地方 ── 创建视图、绑定数据至列表等。 如果曾经有状态记录(参阅后述SavingActivityState 。),则调用此方法时会传入一个包含着此activity 以前状态的包对象做为参数。

总继之以onStart()。

onStart()

onRestart()

在activity 停止后,在再次启动之前被调用。

总继之以onStart()。

onStart()

onStart()

当activity 正要变得为用户所见时被调用。

当activity 转向前台时继以 onResume(),在activity 变为隐藏时继以 onStop()。

onResume()
or
onStop()

onResume()

在activity 开始与用户进行交互之前被调用。此时 activity 位于堆栈顶部,并接受用户输入。

继之以onPause()。

onPause()

onPause()

当系统将要启动另一个activity 时调用。此方法主要用来将未保存的变化进行持久化,停止类似动画这样耗费 CPU 的动作等。这一切动作应该在短时间内完成,因为下一个 activity 必须等到此方法返回后才会继续。

当activity 重新回到前台是继以 onResume()。当activity 变为用户不可见时继以 onStop()。

onResume()
or
onStop()

onStop()

当activity 不再为用户可见时调用此方法。这可能发生在它被销毁或者另一个 activity (可能是现存的或者是新的)回到运行状态并覆盖了它。

如果activity 再次回到前台跟用户交互则继以 onRestart(),如果关闭activity 则继以 onDestroy()。

onRestart()
or
onDestroy()

onDestroy()

在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()


还有就是当切换横竖屏幕时也会发生生命周期事件:


ActivityLifecycle.rar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值