2010年10月25日 星期一

Android Component Lifecycles - Activity(一)

Android內幾種主要元件都有自己的生命週期,在其生命週期的每個階段,都有相對應的callBack method,也就是說當元件在進入該階段時,Android系統就會自動執行該階段的callBack。因此我們可以看到各種元件都會有一些內建的callBack method,如果我們希望在元件的某個階段去執行一些動作,你可以依照需要override認一階段的method

一.Activity的3種狀態(state)
1.active,running
    出現在螢幕的前景,也就是在目前task的activy堆疊的最上層,
    這Activity正被focus並接受使用者的動作
2.paused
    失去了focus,但使用者還是可以看到Activity,其他activity
    在其上方,也許是透明或沒有全螢幕覆蓋,因此paused的Activity
    還可以被看到,一個paused Activy還是在存活狀態(還保有所有資料,
    並被window manager所管理)但在系統記憶體過低時還是可能被砍掉
3.stopped
    當完全被其他的Activity所遮蔽,他是保有一些狀態資料,
    但已經看不到,他的視窗已經被隱藏,當系統記憶體過低會被砍掉

當系統記憶體過低,會將屬於paused與stopped狀態的Activity 砍掉,也就是呼叫其finish()或直接就砍了其process,當要再重新顯示在使用者面前,需要完全restart並restore之前的state 資料

二.Activity LifeCycle Method
當Activity由一個state轉到另一個state的過程中,以下幾個內部method會被自動觸發通知,所以我們若要在特定時間點執行特定動作需要override 相關protected method
protected    void onCreate(Bundle savedInstanceState) 
protected    void onStart() 
protected    void onRestart() 
protected    void onResume() 
protected    void onPause() 
protected    void onStop() 
protected    void onDestroy()

三.Activity 的幾個階段
每個Activity一定要Override onCreate()來作初始化功能,有的會需要override onPause()
去把資料改變記錄下來,以因應可能停止的動作
1.entire lifetime完整生命週期
    一個Activity由onCreate()開始,到最後onDestroy()結束,會在
    onCreate()時做所有初始化的動作,在onDestroy()內釋放所有的
    系統資源。
    例如有一個Thread在背景進行網路資料下載,這thread會在onCreat()
    程序內產生,而在onDestroy()停止這thread
2.visible lifetime
    由呼叫onStart()開始到 onStop()結束,在這過程使用者可以看到
    Activity在螢幕上,在這期間使用者可以看到元件顯示在畫面上,
    但不見得在前景或與使用者互動。
    例如你可以在onStart註冊一個BroadcastReceiver,而在onStop()
    中解除註冊,利用BroadcastReceiver監看UI上的變化,這樣就可
    以觀察到相關的變化,在Activity運作上,onStart()與onStop()
    在進行中可以被多次呼叫
3.foreground lifetime
    由呼叫onResume()到onPause()間,在這區間,Activity在前景,並可
    與使用者互動。Activity經常在這兩個狀態間跳動。    
    例如當Device進入睡眠狀態或另一個Activty要開啟,就會呼叫
    onPause(),而當activity繼續執行,或一個新的intent被發送出來
    Activity內的onResume()就會被呼叫執行

四.Activity LifeCycle Method狀態說明
1.onCreate()
    當activity第一次被產生後,會被執行。
    你可以在這程序內create View,bind data與list,
    在這method被執行時會接收到一個Bundle物件,
    這物件包含了Activity之前的state資料
    
    接下來會執行的有onStart()
2.onRestart()
    當Activity被停止後,又重新啟動時執行(與onStart同)
    接下來會執行的有onStart()
3.onStart()
    在Activity要變成Visible前執行
    
    如果接下來要把Activity顯示在前景,則伴隨著onResume()
    如果接下來要把Activity隱藏,則伴隨著onStop()    
4.onResume()
    在Activity開始與使用者互動前被呼叫
    在這點Activity是在Activity堆疊的最頂端
    
    接下來的會是onPause()
5.onPause()
    當系統要啟動其他Activity,這程序會被呼叫,
    在這程序中需要去處理,把尚未儲存的資料儲存下來,
    停止動畫與其他會消耗CPU的動作,這過程需要非常快速,
    因為下一個Activity會等他return才會執行
    
    若接下來這Activity要回到前景,接下來的會是onResume()
    若接下來這Activity要變隱藏,則接下來會是onStop()
6.onStop()
    當Activity不再讓使用者看到時呼叫
    可能發生在這Activity準備要destroy或是其他的Activity
    回復到前景
    
    假使這Activity要回到前景,接下來會是onResume()
    假若這Activity要整個關閉,接下來會是onDestroy()
7.onDestroy()
    當Activity被Destroyed前被呼叫
    這會是這Activity最後一個接收到通知,
    他可能發生在呼叫了finish()之後,或因為系統因為記憶體
    不足要節少空間而刪除,可以利用isFinishing()來判斷是
    什麼原因造成    

五.儲存Activity state
若要在Activity被關閉重開啟後,可以保留之前的狀態,
可以實做onSaveInstanceState()把資料存下來,儲存到Bundle物件上
而在重啟後讀出來
其相關順序為
onSaveInstanceState()->onPause()
onStart()->onRestoreInstanceState() 
在這過程中只儲存過渡性的資料,不要儲存固定的資料,因為onSaveInstanceState並非會一直被執行到

沒有留言: