1. 程式人生 > >android的task任務棧

android的task任務棧

上次我們講到Activity的四種啟動模式的時候,已經瞭解到一些關於task的技術,今天我再向大家介紹一下。task是一個具有棧結構的容器,可以放置多個Activity例項。啟動一個應用,系統就會為之建立一個task,來放置根Activity;預設情況下,一個Activity啟動另一個Activity時,兩個Activity是放置在同一個task中的,後者被壓入前者所在的task棧,當用戶按下後退鍵,後者從task被彈出,前者又顯示在幕前,特別是啟動其他應用中的Activity時,兩個Activity對使用者來說就好像是屬於同一個應用;系統task和task之間是互相獨立的,當我們執行一個應用時,按下Home鍵回到主屏,啟動另一個應用,這個過程中,之前的task被轉移到後臺,新的task被轉移到前臺,其根Activity也會顯示到幕前,過了一會之後,在此按下Home鍵回到主屏,再選擇之前的應用,之前的task會被轉移到前臺,系統仍然保留著task內的所有Activity例項,而那個新的task會被轉移到後臺,如果這時使用者再做後退等動作,就是針對該task內部進行操作了。

我們今天就講一下和task相關的知識,主要分一下幾點:

1.Activity的affinity(親和力)

2.Intent幾種常見的flags

3.與task相關屬性

affinity:

task對於Activity來說就好像它的身份證一樣,可以告訴所在的task,自己屬於這個task中的一員;擁有相同affinity的多個Activity理論同屬於一個task,task自身的affinity決定於根Activity的affinity值。affinity在什麼場合應用呢?1.根據affinity重新為Activity選擇宿主task(與allowTaskReparenting屬性配合工作);2.啟動一個Activity過程中Intent使用了FLAG_ACTIVITY_NEW_TASK標記,根據affinity查詢或建立一個新的具有對應affinity的task。我們會在後面進行詳細講解。

預設情況下,一個應用內的所有Activity都具有相同的affinity,都是從Application(參考的taskAffinity屬性)繼承而來,而Application預設的affinity是中的包名,我們可以為設定taskAffinity屬性值,這樣可以應用到下的所有,也可以單獨為某個Activity設定taskAffinity。例如:在系統自帶的Browser中,package為com.android.browser,但是卻自定義一個taskAffinity屬性值: