1. 程式人生 > >《Android群英傳》學習筆記之Activity與Activity呼叫棧分析

《Android群英傳》學習筆記之Activity與Activity呼叫棧分析

一、Activity

1、Activity形態:
  • Active/Running 處於棧頂,可互動。
  • Paused 被遮擋但未被完全覆蓋,失去焦點,不可互動。
  • Stopped 被完全覆蓋,但保持了所有狀態資訊和成員變數。
  • Killed Activity被回收或從未被建立過。程式設計師不可控制Stop狀態下何時銷燬Activity。
2、生命週期:

image

  • onDestroy():記得在這裡清除開啟的執行緒,因為引用會在Activity銷燬的時候銷燬,而執行緒不會。
  • onPause():釋放系統資源,如Camera、sensor、receivers等。
  • 系統長時間處於Stop狀態的時候,系統會根據記憶體佔用情況可能會對Acivity進行回收。但會將Acitvity的狀態通過onSaveInstanceState()方法
    存入Bundle物件中(可增加額外的鍵值對存入Bundle)。重建這些被銷燬的Activity時,會將Bundle物件傳入onRestoreInstanceState()方法onCreate()方法中。如果使用者呼叫了finish()方法結束Activity,則不會進行上述操作

二、Android任務棧及啟動模式

  • Android系統通過 棧(Task) 結構來儲存整個App的Activity。
1、AndroidManifest啟動模式
  • (1)standard 標準模式。後進先出,Activity一個一個疊加。
  • (2)singleTop 單一棧頂模式。每次建立新的Activity的時候,系統會自動檢查棧頂
    是否存在相同的例項,如果存在就不會再建立了,但仍會呼叫棧頂Activity的onNewIntent()方法
    • 通常用於接收到訊息後顯示的介面(eg:聊天,連續收到訊息)。
  • (3)singleTask 單一任務棧模式。每次建立新的Acitivy的時候,系統會自動檢查整個任務棧是否存在相同的例項,如果存在就不會再建立了,並且會將棧中該Activity之上的所有Activity全部清除。
    • 通常在主活動設定此模式,用於退出整個應用。
  • (4)singleInstance 建立一個只存在此任務的新的任務棧用於多程式共享。
    • 常用於需要與程式分離的介面
2、Intent Flag啟動模式
  • (1)Intent.FLAG_ACTIVITY_NEW_TASK
    • 使用一個新的Task來啟動一個Activity,啟動的每個Activity都將在一個新的Task中。
    • 通常使用在從Service中啟動Activity,因為Service中沒有Acivity棧。
  • (2)FLAG_ACTIVITY_SINGLE_TOP
    • 使用singletop模式啟動一個activity,與指定android:launchMode="singleTop"相同。
  • (3)FLAG_ACTIVITY_CLEAR_TOP
    • 使用singleTask模式啟動一個activity,與指定android:launchMode="singleTask"相同。
  • (4)FLAG_ACTIVITY_NO_HISTORY
    • 當為B設定此啟動模式後,若A啟動B,B啟動C,B會在啟動C後自動銷燬,棧中只有AC。

三、清空任務棧

可在AndroidManifest檔案中的標籤下使用
  • clearTaskOnLaunch:每次返回該Activity時,都將該Activity之上的所有Activity清除。
  • finishOnTaskLaunch:當用戶離開這個Activity所在的Task,再返回時,該Activity就會被finish掉。
  • alwaysRetainTaskState:該Activity所處的Task不接受任何清理命令,一直保持當前Task狀態。