Android TaskAffinity和allowTaskReparenting屬性

1、TaskAffinity

TaskAffinity翻譯過來就是「任務相關性」,它表示了一個Activity所須要的任務棧的名字。 在平時的開發中,咱們通常不多使用到TaskAffinity這個屬性,也沒有據說過Activity須要什麼任務棧之類的。其實,在默認狀況下,若是不指定TaskAffinity屬性,Activity所需任務棧的名字就是應用的名字android

一、默認的任務棧

咱們在一個應用中啓動三個Activity,而後在Terminal中執行adb shell dumpsys activity命令,結果以下:shell

Running activities (most recent first):
      TaskRecord{853dee #503 A=com.hwldzh.myapplication U=0 StackId=1 sz=3}
        Run #4: ActivityRecord{c1a608e u0 com.hwldzh.myapplication/.ThirdActivity t503}
        Run #3: ActivityRecord{7289178 u0 com.hwldzh.myapplication/.SecondActivity t503}
        Run #2: ActivityRecord{8539f65 u0 com.hwldzh.myapplication/.MainActivity t503}
複製代碼

能夠看到,啓動的三個Activity都位於「com.hwldzh.application」這個任務棧中,而這個名字就是咱們這個應用的包名。bash

二、TaskAffinity初登場

接下來,咱們給ThirdActivity加上TaskAffinity的屬性,即在Manifest中的聲明以下:app

<activity 
      android:name=".ThirdActivity"
      android:taskAffinity="com.hwldzh.ThirdActivity"/>
複製代碼

咱們繼續執行在Terminal中執行adb shell dumpsys activity命令,看ThirdActivity是否處於「com.hwldzh.ThirdActivity」的任務棧中:spa

Running activities (most recent first):
      TaskRecord{853dee #503 A=com.hwldzh.myapplication U=0 StackId=1 sz=3}
        Run #4: ActivityRecord{c1a608e u0 com.hwldzh.myapplication/.ThirdActivity t503}
        Run #3: ActivityRecord{7289178 u0 com.hwldzh.myapplication/.SecondActivity t503}
        Run #2: ActivityRecord{8539f65 u0 com.hwldzh.myapplication/.MainActivity t503}
複製代碼

能夠看到ThirdActivity依然運行在以包名爲名字的任務棧中。這說明了在啓動模式爲Standard下,單獨使用TaskAffinity屬性是無效的翻譯

三、TaskAffinity和SingleTask配合

咱們在ThirdActivity的Manifest聲明中加上SingleTask啓動模式:3d

<activity
      android:name=".ThirdActivity"
      android:launchMode="singleTask"
      android:taskAffinity="com.hwldzh.ThirdActivity"/>
複製代碼

而後執行adb shell dumpsys activity命令,獲得以下結果:code

Running activities (most recent first):
      TaskRecord{5da8e4c #25630 A=com.hwldzh.ThirdActivity U=0 StackId=1 sz=1}
        Run #7: ActivityRecord{1111a92 u0 com.hwldzh.myapplication/.ThirdActivity t25630}
      TaskRecord{b00bc91 #25629 A=com.hwldzh.myapplication U=0 StackId=1 sz=2}
        Run #6: ActivityRecord{93040cf u0 com.hwldzh.myapplication/.SecondActivity t25629}
        Run #5: ActivityRecord{464be1f u0 com.hwldzh.myapplication/.MainActivity t25629}
複製代碼

在將ThirdActivity的啓動模式改成SingleTask以後,能夠看到ThirdActivity啓動的時候建立了一個新的任務棧,而且該任務棧的名字爲TaskAffinity屬性設置的「com.hwldzh.ThirdActivity」。開發

因此,當TaskAffinity和SingleTask啓動模式配對使用時,它是具備該模式的Activity的目前任務棧的名字,待啓動的Activity會運行在名字和TaskAffinity相同的任務棧中。string

2、allowTaskReparenting

allowTaskReparenting屬性的做用是Activity的遷移。當allowTaskReparenting屬性和TaskAffinity配合使用時,Activity能夠從一個任務棧遷移到另外一個任務棧。

遷移的規則是:從一個與該Activity TaskAffinity屬性不一樣的任務棧中遷移到與它TaskAffinity相同的任務棧中。

舉個例子:當一個應用A啓動了應用B的某個Activity後,若是這個Activity的allowTaskReparenting屬性設置爲true,那麼當應用B被啓動,此Activity會直接從應用A的任務棧轉移到應用B的任務棧中。 具體點來講,如今有兩個應用A和B,A啓動了B的一個Activity C,而後按Home鍵回到桌面,而後再單擊B的桌面圖標,這個時候不是啓動了B的主Activity,而是從新顯示了已經被應用A啓動的Activity C。咱們也能夠理解爲,C從A的任務棧轉移到了B的任務棧中。 能夠這麼理解,因爲A啓動了C,這個時候C只能運行在A的任務棧中,可是C屬於B應用,正常狀況下,它的TaskAffinity值確定不可能和A的任務棧相同,因此當B啓動後,B會建立本身的任務棧,這個時候系統發現C本來想要的任務棧已經建立了,因此就把C從A的任務棧中轉移過來了。

參考書目

一、《Android開發藝術探索》

相關文章
相關標籤/搜索