android Activity 应用程序 生命周期

Android 应用程序的生命周期是由Android 框架进行管理,而不是由应用程序直接控
制。
   通常,每一个应用程序(入口一般会是一个Activity 的onCreate 方法),都会占据
一个进程(Process)。当系统记忆体即将不足的时候,会依照优先级自动进行行程(process)
的回收。不管是使用者或开发者, 都无法确定的应用程序何时会被回收。
一个Activity 类别除了OnCreate 函式之外,还预先定义了OnPause(暂停行程时的行
为)、OnResume(继续行程时的行为)等等的基本行为,当从一个Activity 切换到另一个
Activity 的时候,原本的Activity 将经过一连串的状态改变。开发者可以在程序中添加
一些各状态相对应的流程,每次Activity 改变状态时,就会执行相对应的流程。
要让使用者有好的使用经验,Activity 需要在各个周期点上负责保管状态、恢复状态、
传送资料等工作。
Activity 的状态
Android 的虚拟机(VM)是使用堆叠(Stack based) 管理。主要有四种状态:
* Active (活动)
* Paused (暂停)
* Stopped (停止)
* Dead (已回收或未启动)
Active (活动)
"Active"状态是使用者启动应用程序或Activity 后,Activity 运行中的状态。
在Android 平台上,同一个时刻只会有一个Activity 处于活动(Active)或运行
(Running)状态。其他的Activity 都处于未启动(Dead)、停止(Stopped)、或是暂停(Pause)
的状态。
Paused (暂停)
"Paused"状态是当Activity 暂时暗下来,退到背景画面的状态。
当我们使用Toast、AlertDialog、或是电话来了时,都会让原本运行的Activity 退
到背景画面。新出现的Toast、AlertDialog 等界面元件盖住了原来的Activity 画面。
Activity 处在"Paused"状态时,使用者无法与原Activity 互动。
Stopped (停止)
Stopped"状态是有其他Activity 正在执行,而这个Activity 已经离开萤幕,不再动
作的状态。
透过长按"Home"钮,可以叫出所有处于"Stopped"状态的应用程序列表。
在"Stopped"状态的Activity,还可以透过"Notification"来唤醒。"Notification"
会在后面章节中解说。
Dead (已回收或未启动)
"Dead"状态是Activity 尚未被启动、已经被手动终止,或已经被系统回收的状态。
要手动终止Activity,可以在程序中呼叫"finish"函式。我们在加入选单一章中已经
提到过了。
如果是被系统回收,可能是因为记忆体不足了,所以系统根据记忆体不足时的回收规则,
将处于"Stopped"状态的Activity 所占用的记忆体回收。
记忆体不足时的行为
记忆体不足时,Dalvak 虚拟机会根据其记忆体回收规则来回收记忆体:
1. 先回收与其他Activity 或Service/Intent Receiver 无关的行程(即优先回收独
立的Activity)
2. 再回收处于"Stopped"状态的其他类型Activity(在背景等待的Activity)。最久
没有使用的Activity 优先回收(比较官方的说法是"根据LRU 演算法..."). 还不够?
回收Service 行程
4. 快不行啦,关掉可见的Activity/行程
5. 关闭当前的Activity
当系统缺记忆体缺到开始"4. 关掉可见的Activity/行程"时,大概我们换机子的时机
也早该到啦!
观察Activity 运作流程

public class Bmi extends Activity {
private static final String TAG = "Bmi";
public void onCreate()
{
super.onCreate(...);
Log.v(TAG,"onCreate");
}
public void onStart()
{
super.onStart();
Log.v(TAG,"onStart");
}
public void onResume()
{
super.onResume();
Log.v(TAG,"onResume");
}
public void onPause()
{
super.onPause();
Log.v(TAG,"onPause");
}
public void onStop()
{
super.onStop();
Log.v(TAG,"onStop");
}
public void onRestart()
{
super.onRestart();
Log.v(TAG,"onReStart");
}
public void onDestroy()
{
super.onDestroy();
Log.v(TAG,"onDestroy");
}
}


上面的七个状态又可以归纳成三组:
1. 资源分配(Create/Destroy)
完整的Activity 生命周期由"Create"状态开始,由"Destroy"状态结束。建立
(Create)时分配资源,销毁(Destroy)时释放资源。
2. 可见与不可见(Start/ReStart/Stop)
当Activity 运行到"Start"状态时,就可以在萤幕上看到这个Activity。相反地,当
Activity 运行到"Stop"状态时,这个Activity 就会从萤幕上消失。
当使用者按下Back 按钮回到上一个Activity 时,会先到Restart 状态,再到一般
的Start 状态。
3. 使用者能否直接存取萤幕(Resume/Pause)
当有个Toast、AlertDialog、简讯、电话等讯息乱入时,原来的Activity 会进入
"Pause"状态,暂时放弃直接存取萤幕的能力,被中断到背景去,将前景交给优先级高的事
件。当这些优先级高的事件处理完后,Activity 就改进入"Resume"状态,此时又直接存取
萤幕。
Activity 运作流程
由实际运行的记录来看,我们可以归纳出所有Android 应用程序都遵循的动作流程:
一般启动
onCreate -> onStart -> onResume
启动一个Activity 的基本流程是:分配资源给这个Activity(Create 状态),然后
将Activity 内容显示到萤幕上(Start 状态)。在一切就绪后,取得萤幕的控制权(Resume
状态),使用者可以开始使用这个程序。
呼叫另一个Activity
onPause(1) -> onCreate(2) -> onStart(2) - onResume(2) -> onStop(1)
这是个先冻结原本的Activity,再交出直接存取萤幕能力(Pause 状态)的过程。直
到Activity 2 完成一般启动流程后,Activity 1 才会被停止。
回原Activity
onPause(2) -> onRestart(1) -> onStart(1) -> onResume(1) -> onStop(2) ->
onDestroy(2)
点Back 按钮可以回到原本的Activity。
退出结束
onPause -> onStop -> onDestroy
如果程序中有直接呼叫"finish"函式来关闭Activity 的话,系统假设我们很确定我们
在做什麽,因此会直接跳过先冻结(Freeze)的阶段,暂停(Pause),停止(Stop),然后销毁
(Destroy)。
回收后再启动
onCreate ->onStart ->onResume
被回收掉的Activity 一旦又重新被呼叫时,会像一般启动一样再次呼叫Activity 的
onCreate 函式。
当我们使用"Android"手机一阵子,在手机上已经执行过多个应用程序。只要按下"Back"
(返回)键,"Android"就会开启最近一次开启过的Activity。

你可能感兴趣的:(android,框架,虚拟机,算法,活动)