概要說明
Activity是Android組件中最基本也是最為常見用的四大組件(Activity,Service服務,Content Provider內容提供者,BroadcastReceiver廣播接收器)之一。
Activity是一個應用程式組件,提供一個螢幕,用戶可以用來互動為了完成某項任務。
Activity中所有操作都與用戶密切相關,是一個負責與 用戶互動的組件,可以通過setContentView(View)來 顯示指定控制項。
在一個android套用中,一個Activity通常就是一個單獨的螢幕,它上面可以顯示一些控制項也可以監聽並處理用戶的事件做出回響。Activity之間通過Intent進行通信。
詳細說明
基本狀態
在android 中,Activity 擁有四種基本狀態:
1.Active/Running
一個新 Activity 啟動入棧後,它顯示在螢幕最前端,處理是處於棧的最頂端(Activity棧頂),此時它處於可見並可和用戶互動的激活狀態,叫做活動狀態或者運行狀態(active or running)。
2. Paused
當 Activity失去焦點, 被一個新的非全螢幕的Activity 或者一個透明的Activity 被放置在棧頂,此時的狀態叫做暫停狀態(Paused)。此時它依然與視窗管理器保持連線,Activity依然保持活力(保持所有的狀態,成員信息,和視窗管理器保持連線),但是在系統記憶體極端低下的時候將被強行終止掉。所以它仍然可見,但已經失去了焦點故不可與用戶進行互動。
3. Stopped
如果一個Activity被另外的Activity完全覆蓋掉,叫做停止狀態(Stopped)。它依然保持所有狀態和成員信息,但是它不再可見,所以它的視窗被隱藏,當系統記憶體需要被用在其他地方的時候,Stopped的Activity將被強行終止掉。
4. Killed
如果一個Activity是Paused或者Stopped狀態,系統可以將該Activity從記憶體中刪除,Android系統採用兩種方式進行刪除,要么要求該Activity結束,要么直接終止它的進程。當該Activity再次顯示給用戶時,它必須重新開始和重置前面的狀態。
狀態轉換
當一個 Activity 實例被創建、銷毀或者啟動另外一個 Activity 時,它在這四種狀態之間進行轉換,這種轉換的發生依賴於用戶程式的動作。下圖說明了 Activity 在不同狀態間轉換的時機和條件:
圖1. Activity 的狀 態轉換
如上所示,Android 程式設計師可以決定一個 Activity 的“生”,但不能決定它的“死”,也就是說程式設計師可以啟動一個 Activity,但是卻不能手動的“結束”一個 Activity。當你調用Activity.finish()方法時,結果和用戶按下 BACK 鍵一樣:告訴 Activity Manager 該 Activity 實例完成了相應的工作,可以被“回收”。隨後 Activity Manager 激活處於棧第二層的 Activity 並重新入棧,同時原 Activity 被壓入到棧的第二層,從 Active 狀態轉到 Paused 狀態。例如:從 Activity1 中啟動了 Activity2,則當前處於棧頂端的是 Activity2,第二層是 Activity1,當我們調用Activity2.finish()方法時,Activity Manager 重新激活 Activity1 併入棧,Activity2 從 Active 狀態轉換 Stoped 狀態,Activity1. onActivityResult(int requestCode, int resultCode, Intent data)方法被執行,Activity2 返回的數據通過data參數返回給 Activity1。
Activity棧
Android 是通過一種 Activity 棧的方式來管理 Activity 的,一個 Activity 的實例的狀態決定它在棧中的位置。處於前台的 Activity 總是在棧的頂端,當前台的 Activity 因為異常或其它原因被銷毀時,處於棧第二層的 Activity 將被激活,上浮到棧頂。當新的 Activity 啟動入棧時,原 Activity 會被壓入到棧的第二層。一個 Activity 在棧中的位置變化反映了它在不同狀態間的轉換。Activity 的狀態與它在棧中的位置關係如下圖所示:
圖2. Activity 的狀 態 與它在 棧 中的位置 關 系
如上所示,除了最頂層即處在 Active 狀態的 Activity 外,其它的 Activity 都有可能在系統記憶體不足時被回收,一個 Activity 的實例越是處在棧的底層,它被系統回收的可能性越大。系統負責管理棧中 Activity 的實例,它根據 Activity 所處的狀態來改變其在棧中的位置。
方法通知
下面的圖顯示了Activity的重要狀態轉換,矩形框表明Activity在狀態轉換之間的回調接口,開發人員可以重載實現以便執行相關代碼,帶有顏色的橢圓形表明Activity所處的狀態。
圖 3 . Activity 的狀 態 轉換的方法和實現
在上圖中,Activity有三個關鍵的循環:
1. 整個的生命周期,從onCreate(Bundle)開始到onDestroy()結束。Activity在onCreate()設定所有的“全局”狀態,在onDestory()釋放所有的資源。例如:某個Activity有一個在後台運行的執行緒,用於從網路下載數據,則該Activity可以在onCreate()中創建執行緒,在onDestory()中停止執行緒。
2. 可見的生命周期,從onStart()開始到onStop()結束。在這段時間,可以看到Activity在螢幕上,儘管有可能不在前台,不能和用戶互動。在這兩個接口之間,需要保持顯示給用戶的UI數據和資源等,例如:可以在onStart中註冊一個IntentReceiver來監聽數據變化導致UI的變動,當不再需要顯示時候,可以在onStop()中註銷它。onStart(),onStop()都可以被多次調用,因為Activity隨時可以在可見和隱藏之間轉換。
3. 前台的生命周期,從onResume()開始到onPause()結束。在這段時間裡,該Activity處於所有 Activity的最前面,和用戶進行互動。Activity可以經常性地在resumed和paused狀態之間切換,例如:當設備準備休眠時,當一個 Activity處理結果被分發時,當一個新的Intent被分發時。所以在這些接口方法中的代碼應該屬於非常輕量級的。