Activity 生命周期


  
理解Activity 的生命周期对应用程序开发来说是至关重要的,这样才能确保您的应用提供了一个很好的用户体验和妥善管理其资源。由于OPhone 应用程序不控制自己的进程寿命,由OPhone Runtime 管理每个应用程序进程,但是每个Activity 的状态反过来会影响到OPhone Runtime 是否将终止当前Activity 和还是让它继续运行。 
  
Actvity 堆栈 
每个Actvity 的状态由它所在Activity 栈中的位置所决定,所有当前正在运行的Actvity 将遵循照后进先出的原则。当一个新的Activity 启动,当前的Activity 将移至堆栈的顶部,如果用户使用Back 按钮,或在前台Activity 被关闭,下一个Activity 将被激活并且移至到堆栈的顶部。 
(这个过程本来是有个图的,可是贴不上去,抱歉!) 
   
Activity 状态 
随着Activity 的创建和销毁,也就会进出栈,其中可能会经历以下四种状态: 
• Active 状态:这时候Activity 处于栈顶,且是可见的,有焦点的,能够接收用户输入前景Activity。OPhone Runtime 将试图不惜一切代价保持它活着,甚至杀死其他Activity 以确保它有它所需的资源。当另一个Activity 变成Active 时,当前的将变成Paused 状态。 
• Paused 状态:在某些情况下,你的Activity 是可见的,但没有焦点,在这时候,Actvity 处于Paused 状态。例如,如果有一个透明或非全屏幕上的Activity 在你的Actvity 上面,你的Activity 将。当处于Paused 状态时,该Actvity 仍被认为是Active 的,但是它不接受用户输入事件。在极端情况下,OPhone Runtime 将杀死Paused Activity,以进一步回收资源。当一个Actvity 完全被遮住时,它将进入Stopped 状态。 
• Stopped 状态:当Activity 是不可见的时,Activity 处于Stopped 状态。Activity 将继续保留在内存中保持当前的所有状态和成员信息,假设系统别的地方需要内存的话,这时它是被回收对象的主要候选。当Activity处于Stopped 状态时,一定要保存当前数据和当前的UI 状态,否则一旦Activity 退出或关闭时,当前的数据和UI 状态就丢失了。 
• Inactive 状态:Activity 被杀掉以后或者被启动以前,处于Inactive 状态。这时Activity 已被移除从Activity堆栈中,需要重新启动才可以显示和使用。 
状态过渡具有不确定性并且由OPhone Runtime 完全管理。OPhone Runtime 将首先杀掉处于Stopped 状态的Activity,在极端情况下,也会杀掉那些处于Paused 状态的Activity。 
为确保无缝的用户体验,这些状态之间的过渡对用户来说应该做到透明的。不管Activity 处于那种状态,最重要的是保留好UI 状态和用户数据,一旦Actvity 被激活,用户都能看到他想要的东西。 
  
如何监测Actvity 的状态变化 
为了确保Activity 能够及时的响应状态的变化,OPhone 提供了一系列的事件处理程序来处理Activity的状态转移(这里也有个图供参考,目前也贴不上去),示例代码如下: 
   
• 1.public class MyActivity extends Activity { 
• 2. // 在Activity 生命周期开始时被调用 
• 3. public void onCreate(Bundle icicle) { 
• 4. } 
• 5. // onCreate 完成后被调用,用来回复UI 状态 
• 6. public void onRestoreInstanceState(Bundle savedInstanceState) { 
• 7. } 
• 8. //当activity 从停止状态重新启动时调用 
• 9. public void onRestart(){ 
10 
• 10. } 
• 11. //当activity 对用户即将可见的时候调用。 
• 12. public void onStart(){ 
• 13. } 
• 14. //当activity 将要与用户交互时调用此方法,此时activity 在activity 栈的栈顶,用户输入已经可以传递给它 
• 15. public void onResume(){ 
• 16. } 
• 17. // Activity 即将移出栈顶保留UI 状态时调用此方法 
• 18. public void onSaveInstanceState(Bundle savedInstanceState) { 
• 19. } 
• 20. //当系统要启动一个其他的activity 时调用(其他的activity 显示之前),这个方法被用来提交那些持久数据的 
改变、停止动画、和其他占用CPU 资源的东西。由于下一个activity 在这个方法返回之前不会resumed,所以实现这个 
方法时代码执行要尽可能快。 
• 21. public void onPause(){ 
• 22. } 
• 23. //当另外一个activity 恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity 启动、其它activity 
被切换至前景、当前activity 被销毁时都会发生这种场景。 
• 24. public void onStop(){ 
• 25. } 
• 26. //在activity 被销毁前所调用的最后一个方法,当进程终止时会出现这种情况 
• 27. public void onDestroy(){ 
• 28. } 
  
Activity 完整的生命周期 
完整的Activity 生命周期之间从调用的OnCreate 开始,到调用onDestroy 结束。有可能在某些情况下,一个Activity 被终止时并不调用onDestroy 方法。 
使用OnCreate 方法来初始化你的Activity:初始化的用户界面,分配引用类变量,绑定数据控件,并创建服务和线程。在OnCreate 方法传递的对象Bundle 包含最后一次调用onSaveInstanceState 保存的UI状态。你可以使用这个Bundle 恢复用户界面到以前的状态,无论是在OnCreate 方法或通过覆盖onRestoreInstanceStateMethod 方法。 
覆盖onDestroy 方法来清理OnCreate 中创建的任何资源,并确保所有外部连接被关闭,例如网络或数据库的联系。 
为了避免创造短期对象和增加垃圾收集的时间,以致对用户体验产生直接影响。如果你的Activity需要创建一些对象的话,最好在onCreate 方法中创建,因为它仅调用一次在一个Actvity 的完整生命周期中。 
  
Activity 可见的生命周期 
一个Activity 可见的生命周期始于OnStart 调用,结束于OnStop 调用。在这两个方法中间,你的Actvity 将会对用户是可见的,尽管它可能没有焦点,也可能部分被遮挡着。在一个Activity 完整的生命周期中可能会经过几个Activity 可见的生命周期,因为你的Activity 可能会经常在前台和后台之间切换。 
在极端情况下,OPhone Runtime 将杀掉一个Activity 即使它在可见状态并且并不调用onStop 方法。 
OnStop 方法用于暂停或停止动画,线程,定时器,服务或其他专门用于更新用户界面程序。当用户界面是再次可见时,使用OnStart(或onRestart)方法来恢复或重新启动这些程序。 
OnRestart 方法优先于onStart 被调用当一个Activity 被重现可见时,使用它你可以实现一些Activity 重新可见时的特殊的处理。OnStart / OnStop 方法也被用来注册和注销专门用于更新用户界面Intent 接收者。 
  
Activity 活跃的生命周期 
一个Activity 活跃的生命周期始于OnResume 调用,结束于OnPause 调用。一个活跃的Actvity总是在前台并且接收用户输入事件。当一个新的Actvity 启动,或该设备进入休眠状态,或失去焦点,Activity 活跃的生命周期就结束了。尽量在onPause 和onResume 方法中执行较量轻的代码以确保您的应用程序能够快速响应Acitvity 在前台和后台之间切换。 
在调用onPause 之前,onSaveInstanceState 会被调用。这个方法提供了一个机会保存当前的UI 状态到Bundle 当中。Bundle 信息将会被传递到OnCreate 和onRestoreInstanceState 方法。使用onSaveInstanceState 保存UI 状态(如检查按钮状态,用户焦点,未提交用户输入)能够确保目前相同的用户界面当Activity 下次被激活时。在Activity 活跃生命周期中,你可以安全地认为onSaveInstanceState 和onPause 将被调到即使当前进程将终止。 
  
Activity 生命周期示例 
• 父Activity 启动子Activity,子Actvity 退出,父Activity 调用顺序如下 
onCreate() 
onStart() 
onResume() 
onFreeze() 
onPause() 
onStop() 
onRestart() 
onStart(),onResume() … 
• 用户点击Home,Actvity 调用顺序如下 
onCreate() 
onStart() 
onResume() 
onFreeze() 
onPause() 
onStop() -- Maybe 
onDestroy() – Maybe 
• 调用finish( ), Activity 调用顺序如下 
onCreate() 
onStart() 
onResume() 
onPause() 
onStop() 
onDestroy() 
• 在Activity 上显示dialog, Activity 调用顺序如下 
onCreate() 
onStart() 
onResume() 
• 在父Activity 上显示透明的或非全屏的activity,Activity 调用顺序如下 
onCreate() 
onStart() 
onResume() 
onFreeze() 
onPause() 
• 设备进入睡眠状态,Activity 调用顺序如下 
onCreate() 
onStart() 
onResume() 
onFreeze() 
onPause() 
  
  
转自:http://forum.byr.edu.cn/article/MobileTerminalAT/310?p=1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值