AmS中的一些重要排程相關變數

broadviewbj發表於2011-09-26

AmS中的一些重要排程相關變數

要了解AmS排程、管理系統中的Activity的細節,必須瞭解AmS中定義的重要內部變數。要一下了解這些變數的使用時機並非易事,因此,本節僅簡要說明一些變數的作用,至於具體使用的時機,要結合排程的具體過程瞭解。

1.系統常量

static final int MAX_ACTIVITIES = 20;

系統只能有一個Activity處於執行狀態,對於非執行狀態的ActivityAmS會在內部暫時快取起來,而不是立即殺死,但如果後臺的Activity數目超過該常量,則會強制殺死一些優先順序較低的Activity,所謂的“優先順序高低”的規則見第10.2節。

static final int MAX_RECENT_TASKS = 20;

AmS會記錄最近啟動的Activity,但只記錄20個,超過該常量後,AmS會捨棄最早記錄的Activity

static final int PAUSE_TIMEOUT = 500;

AmS通知應用程式暫停指定的Activity時,AmS的忍耐是有限的,因為只有500毫秒,如果應用程式在該常量時間內還沒有暫停,AmS會強制暫停關閉該Activity。這就是為什麼在應用程式設計時,不能在onPause()中做過多事情的原因。

static final int LAUNCH_TIMEOUT = 10*1000;

AmS通知應用程式啟動(Launch)某個Activity時,如果超過10sAmS就會放棄。

static final int PROC_START_TIMEOUT = 10*1000;

AmS啟動某個客戶程式後,客戶程式必須在10秒之內報告AmS自己已經啟動,否則AmS會認為指定的客戶程式不存在。

2.等待序列

由於AmS採用Service機制運作,所有的客戶程式要做什麼事情,都要先請求AmS,因此,AmS內部必須有一些訊息序列儲存這些請求,並按順序依次進行相應的操作。

final ArrayList mHistory = new ArrayList();

這是最最重要的內部變數,該變數儲存了所有正在執行的Activity,所謂正在執行是指該HistoryRecordfinishing狀態為true。比如當前和使用者互動的Activity屬於正在執行,從A1啟動到A2,儘管A1看不見了,但是依然是正在執行,從A2按“Home”鍵回到桌面,A2也是正在執行,但如果從A2按“Back”鍵回到A1A2就不是正在執行狀態了,它會從mHistory中刪除掉。

private final ArrayList mLRUActivities = new ArrayList();

LRU代表Latest Recent Used,即最近所用的Activity列表,它不像mHistory僅儲存正在執行的ActivitymLRUActivities會儲存所有過去啟動過的Activity

final ArrayList mPendingActivityLaunches
= new ArrayList();

AmS內部還沒有準備好時,如果客戶程式請求啟動某個Activity,那麼會被暫時儲存到該變數中,這也就是Pending的含義。這種情況一般發生在系統啟動時,系統程式會查詢系統中所有屬性為Persisitant的客戶程式,此時由於AmS也正在啟動,因此,會暫時儲存這些請求。

final ArrayList mStoppingActivities
= new ArrayList();

AmS的設計中,有這樣一個理念:優先啟動,其次再停止。即當使用者請求啟動A2時,如果A1正在執行,AmS首先會暫停A1,然後啟動A2,當A2啟動後再停止A1。在這個過程中,A1會被臨時儲存到mStoppingActivities中,知道A2啟動後並處於空閒時,再回過頭來停止mStoppingActivities中儲存的HistoryRecord列表。

final ArrayList mFinishingActivities = new ArrayList();

mStoppingActivities有點類似,當AmS認為某個Activity已經處於finish狀態時,不會立即殺死該Activity,而是會儲存到該變數中,直到超過系統設定的警戒線後,才去回收該變數中的Activity

3.當前不同狀態的HistoryRecord

HistoryRecord mPausingActivity = null;

正在暫停的Activity,該變數只有在暫停某個Activity時才有值,代表正在暫停的Activity

HistoryRecord mResumedActivity = null;

當前正在執行的Activity,這裡的正在執行並不見得一定是正在與使用者互動。比如當使用者請求執行A2時,當前正在執行A1,此時AmS會首先暫停A1,而在暫停的過程中,AmS會通知WmS暫停獲取使用者訊息,而此時mResumedActivity依然是A1

HistoryRecord mFocusedActivity = null;

這裡的Focus並非是正在和使用者互動,而是AmS通知WmS應該和使用者互動的Activity,而在WmS真正處理這個訊息之前,使用者還是不能和該Activity互動。

HistoryRecord mLastPausedActivity = null;

上一次暫停的Activity

 AmS中的一些重要排程相關變數

本文選自《Android核心剖析 》一書

圖書詳細資訊:http://space.itpub.net/?uid-13164110-action-viewspace-itemid-708207

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-708305/,如需轉載,請註明出處,否則將追究法律責任。

相關文章