参考百度文库:http://wenku.baidu.com/view/cebde7f7ba0d4a7302763a57.html
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的状态转移,参考下图和示例代码。
在一个Activity的完整的生命周期里,既创造和销毁之间,它会经过一个或多个不同状态之间的转移包括从可见的到不可见,从Active到Inactive。每一次状态的转移都将触发以上这些事件。
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()
----------------------------------------------------------------------
Android应用程序有一个特殊的概念:应用程序的生命周期。这个问题,大部分人都会轻视,然后等在这里跌倒了,才会回头看看,我就是这样的一个人。但亡羊补牢,犹未晚矣!
下面的这部分讲的很简单,但是请注意千万记住了。应用程序的生命周期严重的影响了系统资源以及提高用户体验直观重要。
1:Activity栈:
Android系统中,所有的Activity被保存在Activity栈中。当启动一个新的Activity时,那么这个Activity就会被压入Activity栈顶部。
如果用户通过“返回”键回到上面一个Activity的画面。那么栈顶的Activity就会被弹出。之前位于栈顶的第二个Activity就变成新的栈顶Activity.并显示在屏幕上。
一点补充:当按了Return后,就会调用OnPause().OnStop(),OnDestroy().你如果是按Home,就不会执行OnDestroy。
2:Activity的状态:活跃;暂停;结束;销毁或为启动;
活跃:当一个Activity位于Activity栈顶部。
暂停:可见,但是没有焦点。
结束:当Activity所显示的用户界面在屏幕上不可见。
销毁或未启动:当Activity彻底借宿或者关闭后。它的状态就变成非活跃状态。这时,Activity已经从Activity栈中移除。
补充:当我们按“返回”时,会依次变成:暂停,停止,销毁。
当我们按“Home”时,依次暂停,停止。
3:下面我们做一个ActivityLifeDemo来测试,利用Logcat 来打印。
Logcat的使用很简单。Logcat.i("Rocky","OnCreate");
利用adb shell 工具查看。如果是上面的格式,则在adb shell里面输入:
logcat -s Rocky I
即可查看我们的打印信息。
重写Activity的一下代码段:
OnCreate();
OnResume();
OnStart();
OnRestart();
OnPuase();
OnStop();
OnDestroy();
下面,我们进行一下操作看看它的打印信息:
第一次打开Activity:OnCreate ,OnStart,OnResume
按返回键: OnPause,OnStop,OnDestroy
重新打开Activity: OnCreate ,OnStart,OnResume
按Home键:OnPause,OnStop
此时Activity不可见了。通过再次打开Activity:
OnRestart,OnStart,OnResume
这个打印信息提醒我们,不要在OnCreate里面做一初始化的动作。有些动作应该放在OnStart(),OnResume里面。他们对于的是OnPuase,OnStop函数。
这个时候,我们再点击返回键:会出现OnPause,OnStop,OnDestroy.
以上的这些东西是我们通过实际测试数据得到的。
4:Activity完整的生命周期:
通过上面可以看见,在Activity按Home键的时候,程序不见了,但是生命周期没有完。
所以完整的程序的生命周期是:
从OnCreate创建Activity到OnDestroy回收Activity的过程。
5:可见的Activity的生命周期:
什么周期的过程中,有些时候我们是看不见的。这个时候要注意了,程序没有被关闭。所以你需要注意。本人就是因为这个错误,才写了这篇日记来记录自己的错误。
可见:OnStart 到OnStop之间。
有焦点:OnResume 到OnPause之间。
在OnStop方法中,我们应当暂停或者结束动画,线程,定时器服务等这些用来更新用户界面的资源。Activity变成Invisible时,这些资源的更新没有任何意思反而会增加系统消耗。
正确的方法是当UI变的可见之后,调用OnStart或者OnRestart方法继续或者重启Activity的这些资源。
OnStart()和OnStop也被用于注册、取消注册BroadcastReceiver.
6:OnSaveInstanceState()是为了保持用户的界面信息到Bundle中。会在OnPause之前调用。这样下次Activity变得活跃的时候呈现和上次一样的用户界面。
7:这篇文件的内容我也迷迷糊糊的看过很多次,但是碰见问题还是了犯了错误。唯有自己亲自动手试试,才能是自己的。