2008年9月9日 星期二

Android Activity生命週期簡介

何謂Activity:最簡單的就是你可以把Activity看成一個User Interface Program,原則上它會提供使用者一個互動式的介面功能,那一個activity只有一個UI嗎?當然不是囉,舉例來說:一個EMail程式,就可能包含三個activity(1)郵件列表的activity(2)顯示郵件內容的activity(3)寫新郵件或回覆郵件的activity。

所有的Activity在系統裏由Activity堆疊所管理,當一個新的Activity被執行後,它將會被放置到堆疊的最頂端,並且變成"running activity", 而先前的Activity原則上還是會存在於堆疊中,但它此時不會是在前景的情況,除非剛剛那個新的Activity離開。

一個Activity基本上有四個生命狀態

  • 當一個Activity在螢幕的最上層時(堆疊的最頂端),它就是屬於activerunning的狀態


  • 如果一個Activity失去焦點(focus)但還看得到它的畫面(比如:一個新的Activity畫面並不是全螢幕或者它是一個半透明的情況),那失去焦點的這個Activity則處在paused的狀態。像這個失去焦點的Activity它還是完全活著的喔,並沒有消失。(活著的意思是指,Activity自已本身所有的狀態及資料都還是存在的,也跟視窗管理程式window manager保持連繫著),像這種paused的activity,會在一種情況下消失,那就是當系統的記憶體不夠用之時,系統會自動判斷,把不重要的activity移除。


  • 如果一個Activity被其它的Activity完全的遮住時,這個被遮的Activity處於stop的狀態,它仍然保有全部的狀態及資料,但因為它已不再被使用者看見,所以它的畫面是被隱藏起來的(畫面不需要更新),當系統記憶體不足時,這種stop狀態的activity是最先被系統考慮拿來釋放記憶體的。


  • 當一個Activity處於pause或stop的狀態時,系統可以要求Activity結束(finish)或直接移除(kill)它。當它需要再度呈現在使用者面前時,它必需要能完整的重新啟動及回復先前的狀態。


  • 底下的流程圖呈現出一個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/

    沒有留言:

    一個小故事讓我們明白資金流通的意義

    “又是炎熱小鎮慵懶的一天。太陽高掛,街道無人,每個人都債台高築,靠信用度日。這時,從外地來了一位有錢的旅客,他進了一家旅館,拿出一張1000 元鈔票放在櫃檯,說想先看看房間,挑一間合適的過夜,就在此人上樓的時候---- 店主抓了這張1000 元鈔,跑到隔壁屠戶那裡支付了他欠的肉錢...