所有的Activity在系統裏由Activity堆疊所管理,當一個新的Activity被執行後,它將會被放置到堆疊的最頂端,並且變成"running activity", 而先前的Activity原則上還是會存在於堆疊中,但它此時不會是在前景的情況,除非剛剛那個新的Activity離開。
一個Activity基本上有四個生命狀態
底下的流程圖呈現出一個Activity的狀態運行的情況,長方形的方塊代表著回呼函式(callback methods)你可以自已實作出在每個狀態你想要處理的事情,有顏色的部份就是實際Activity會處於的狀態。
上圖裏有三個主要迴路
(1)entire lifetime:
一個Activity的entire lifetime是由onCreate(Bundle)開始,一直到onDestroy()結束。一個Activity可以把所有的資源設定寫在onCreate裏,一直到onDestroy()時,再釋放出來。比如說,你需要一個執行緒在背景執行網路下載資料,這個thread就可以在onCreate()裏建立起來,一直到onDestroy()再把thread釋放不要用。
(2)visible lifetime:
一個Activity的visible lifetime則是指在onStart()到onStop()之間,算是"可視生命時期",在這段時間內,使用者可以在螢幕上看見Activity,要注意這個"看見"算是抽象形容詞@@這個Activity不見得一定在前景直接跟使用者可直接互動。比如說:你可以在onStart()註冊一個BroadcastReceiver用來監控並改變你的UI,當使用者不想再看你所呈現的結果時,在onStop()移除註冊的BroadcastReceiver。onStart()跟onStop()可以在activity在visible及hidden兩個狀態切換時多次被呼叫執行。
(3)foreground lifetime:
一個foreground lifetime則是指onResume()到onPause()之間,在這個時期的Activity是在所有的Activity的前面,並且直接跟使用者進行互動,所以這段時期指的就是圖裏的Activity is running囉。 一個Activity能很頻繁的在resume及pause這兩個狀態切換,比如:當一個裝置進行睡眠時,當一個Activity的結果被傳送,當一個新的intent被傳送時。所以在onResume()及onPause()裏實作的程式應盡量精簡。
看到這裏先做個小結:onCreate()用來做程式的初使化動作,onDestory()通常都拿來把onCreate()時所要來的資料做釋放的動作,onPause()時把需要保存的資料在此時保存,onResume()把保存的資料拿回來使用。
整個Activity的生命週期所用到的方法(methods)定義如下表,這些methods都可以依據你實際上的需求去繼承出來改寫它的行為。所有的Activity都會實作onCreate(Bundle)來實現他們的初使化設定;或許你也需要去實作出onPause()來保留一些資料;但請記得當你要使用這些methods時必需要做一件事情,那就是在你改寫的methods裏必需呼叫superclass相對應的methods.如:super.onCreate(Bundle)。
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
底下這段影片是在說明Activity Lifecycle的影片,內容有個lifecycle的demo,可以讓你對onCreate/onStart/onResume/onPause/onStop...更有感覺。
lifecycle demo的程式碼: svn://svn.sleepydog/net/guestarea/android/LifeCycleDemo
user=android_ro
password=welcome
更詳細的內容請參照
http://code.google.com/android/reference/android/app/Activity.html
http://sleepydroid.blogspot.com/
http://blip.tv/file/958450/
沒有留言:
張貼留言