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。