對(duì)Android開發(fā),Activity棧是很重要的概念,在AMS中任務(wù)棧用了很多抽象來描述,這里簡(jiǎn)單學(xué)習(xí)下。
ActivityStack、TaskRecord、 ActivityRecord
這三個(gè)都是AMS中Activity 棧相關(guān)的模型,
ActivityStack
為了讓這許多Activity協(xié)同工作而不至于產(chǎn)生混亂,Android平臺(tái)設(shè)計(jì)了ActivityStack機(jī)制用于管理Activity,其遵循先進(jìn)后出的原則,系統(tǒng)總是顯示位于棧頂?shù)腁ctivity,從邏輯上將,位于棧頂?shù)腁ctivity也就是最后打開的Activity, 這也是符合邏輯的。
在操作應(yīng)用程序時(shí),每次啟動(dòng)新的Activity,都會(huì)將此壓入Activity Stack,當(dāng)用戶執(zhí)行返回操作時(shí),移除Activity Stack頂上的Activity,這樣就實(shí)現(xiàn)了返回上一個(gè)Activty的功能。直到用戶一直返回到Home Screen,這時(shí)候可以理解為移除了Activity Stack所有的Activity,這個(gè)Activity Stack不再存在,應(yīng)用程序也結(jié)束了運(yùn)行.
共五種:
- HOME_STACK_ID
Home應(yīng)用以及recents app所在的棧 - FULLSCREEN_WORKSPACE_STACK_ID
一般應(yīng)用所在的棧 - FREEFORM_WORKSPACE_STACK_ID
類似桌面操作系統(tǒng) - DOCKED_STACK_ID
- PINNED_STACK_ID
畫中畫棧
TaskRecord
task是指將相關(guān)的Activity組合到一起,以Activity Stack的方式進(jìn)行管理。大部分場(chǎng)景上,一個(gè)“應(yīng)用程序”就是一個(gè)Task,但其實(shí),一個(gè)Task是可以有一個(gè)或多個(gè)Android Application組成的,一個(gè)應(yīng)用也可以有多個(gè)task。而TaskRecord就是在ams中task的描述類
taskAffinity:
可以翻譯為任務(wù)相關(guān)性。這個(gè)參數(shù)標(biāo)識(shí)了一個(gè) Activity 所需要的任務(wù)棧的名字,默認(rèn)情況下,所有 Activity 所需的任務(wù)棧的名字為應(yīng)用的包名,當(dāng) Activity 設(shè)置了 taskAffinity 屬性,那么這個(gè) Activity 在被創(chuàng)建時(shí)就會(huì)運(yùn)行在和 taskAffinity 名字相同的任務(wù)棧中,如果沒有,則新建 taskAffinity 指定的任務(wù)棧,并將 Activity 放入該棧中。另外,taskAffinity 屬性主要和 singleTask 或者 allowTaskReparenting 屬性配對(duì)使用,在其他情況下沒有意義。
<activity android:name="com.example.myapplication.Activity1"/>
<activity android:name="com.example.myapplication.Activity2"
android:launchMode="singleTask"
android:taskAffinity="com.example.t2"/>
上面這個(gè)例子中Activity1打開Activity2會(huì)在兩個(gè)task里,而去掉Activity2的singletask或taskaffinity就還是會(huì)在一個(gè)task里
ActivityRecord
ams中activity的描述類,包含了activity在manifest中的這個(gè)配置、在系統(tǒng)中的狀態(tài)等。
簡(jiǎn)單來說在ams里,一個(gè)ActivityStack管理TaskRecord,而每個(gè)TaskRecord又管理了多個(gè)ActivityRecord,當(dāng)然由于AMS及其復(fù)雜,ActivityStack中也有很多地方直接操作ActivityRecord
AMS中其他Activity相關(guān)類
ActivityDisplay
描述Display的類,簡(jiǎn)單的說Display可以看做物理屏幕的一個(gè)抽象,ActivityStack也是歸屬于ActivityDisplay的
ActivityStackSupervisor
顧名思義,就是ActivityStack的管理者,AMS中對(duì)ActivityStack、TaskRecord、ActivityRecord的操作主要由其負(fù)責(zé)
ActivityStarter
負(fù)責(zé)了Activity啟動(dòng)的很多邏輯
未完待續(xù)。。