您的位置:首页 > 移动开发 > Android开发

activity的生命周期及启动的四种模式,栈管理

2015-05-31 00:20 591 查看
       相信大家对android中activity的生命周期大都了解,详情参考 http://blog.sina.com.cn/s/blog_75016706010164wb.html
  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的状态转移,参考下图和示例代码。 

  

 

view
plain copy to clipboard print ?

public class MyActivity extends Activity
{

// 在Activity生命周期开始时被调用

public void onCreate(Bundle
icicle) {

}

// onCreate完成后被调用,用来回复UI状态

public void onRestoreInstanceState(Bundle
savedInstanceState) {

}

//当activity从停止状态重新启动时调用

public void onRestart(){

}

//当activity对用户即将可见的时候调用。

public void onStart(){

}

//当activity将要与用户交互时调用此方法,此时activity在activity栈的栈顶,用户输入已经 可以传递给它

public void onResume(){

}

// Activity即将移出栈顶保留UI状态时调用此方法

public void onSaveInstanceState(Bundle
savedInstanceState) {

}

// 当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占 用 CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。

public void onPause(){

}

//当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。

public void onStop(){

}

//在activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况

public void onDestroy(){

}

Java代码

public class MyActivity extends Activity
{

// 在Activity生命周期开始时被调用

public void onCreate(Bundle
icicle) {

}

// onCreate完成后被调用,用来回复UI状态

public void onRestoreInstanceState(Bundle
savedInstanceState) {

}

//当activity从停止状态重新启动时调用

public void onRestart(){

}

//当activity对用户即将可见的时候调用。

public void onStart(){

}

//当activity将要与用户交互时调用此方法,此时activity在activity栈的栈顶,用户输入已经 可以传递给它

public void onResume(){

}

// Activity即将移出栈顶保留UI状态时调用此方法

public void onSaveInstanceState(Bundle
savedInstanceState) {

}

//当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占用 CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。

public void onPause(){

}

//当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。

public void onStop(){

}

//在activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况

public void onDestroy(){

}

   在一个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的生命周期:

   先说standard:这个最简单啦,比如四个standard的activity依次启动A—B—C—D,此时进行startActivity操作,从D—B,显然栈底到栈顶的activity分别为A-B-C-D-B,这个无可厚非。如果从D-D呢,此时栈底到栈顶的activity分别为A-B-C-D—D,按返回键会依次跳到D-C-B-A。

   再说singleTop:依旧是四个singleTop的activity依次启动A—B—C—D,此时进行startActivity操作,从D—B,显然栈底到栈顶的activity分别为A-B-C-D-B,这个无可厚非。如果从D-D呢,此时栈底到栈顶的activity分别为A-B-C-D,按返回键会依次跳到C-B-A。生命周期为

   A启动时: A onCreate,A onStart,A onResume;

 
 A-B时:  A onPause B onCreate,B onStart,B onResume,A onStop;

 
 B-C时:  B onPause
C onCreate,C onStart,C onResume,B onStop;

 
 C-D时:  C onPause
D onCreate,D onStart,D onResume,C onStop;

 
 D-D时:  D onPause,D onResume

 
 返回键D-C: D onPause,C
onStart,C onResume,D onStop,D onDestroy

 
 返回键C-B: C onPause,B
onStart,B onResume,C onStop,C onDestroy

 
 返回键B-A: B onPause,A onStart,A onResume,B onStop,B onDestroy

 
 再说singleTask:依旧是四个singleTask的activity依次启动A—B—C—D,此时进行startActivity操作,从D—A,显然栈底到栈顶的activity分别为A。如果从D-D呢,此时栈底到栈顶的activity分别为A-B-C-D,按返回键会依次跳到C-B-A。

   A—B—C—D—A按返回键

   A启动时: A onCreate,A onStart,A onResume;

   A-B时:  A onPause, B onCreate,B onStart,B onResume,A onStop;

   B-C时:  B onPause, C onCreate,C onStart,C onResume,B onStop;

   C-D时:  C onPause, D onCreate,D onStart,D onResume,C onStop;

   D-A时:  BonDestroy,C onDestroy,D onPause,A
onStart,A onResume,D onStop,D onDestroy;(B,C会提前被destroy,并且先destroy
B,然后destroy C,还没搞明白原因)   

   返回键: A onPause,A onStop,A onDestroy

   A—B—C—D—D按返回键

   A启动时: A onCreate,A onStart,A onResume;

   A-B时:  A onPause, B onCreate,B onStart,B onResume,A onStop;

   B-C时:  B onPause, C onCreate,C onStart,C onResume,B onStop;

   C-D时:  C onPause, D onCreate,D onStart,D onResume,C onStop;

   D-D时:  D onPause,D onResume   

   返回键D-C: D onPause,C onStart,C onResume,D onStop,D onDestroy

   返回键C-B: C onPause,B onStart,B onResume,C onStop,C onDestroy

   返回键B-A: B onPause,A onStart,A onResume,B onStop,B onDestroy

   singleInstance就不细说了,大家可以回去研究一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息