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

android的activity任務棧

網站 默認 其中 命令 應用 認識 不存在 com systemui

  activity的任務棧和啟動模式,看了各種網站和書還是感覺不得其法。於是網上找到了adb的一條命令:

  

    adb shell dumpsys activity activities

   這條語句會列出手機中存在的任務棧。

  1、清空所有後臺任務,運行了一個自己寫的測試應用,發現任務棧的結構如下:

    

Stack #1:
    Task id #74
        affinity=包名
        Activities=[XXX]
    Task id #73
        affinity=包名
        Activities=[XXX]

Stack #
0: Task id #1 affinity=com.huawei.android.launcher Activities=[[ActivityRecord{3d2a088 u0 com.huawei.android.launcher/.unihome.UniHomeLauncher t1}]
   Task id #3
     affinity=com.android.systemui
     Activities=[ActivityRecord{e8167f6 u0 com.android.systemui/.recents.RecentsActivity t3}]


  android中的所謂任務棧,其實有兩層:任務棧包含Task,Task包含Activity。


然後修改Activity的啟動模式進行測試(自己測試的,不知道是不是不同手機會有不同結果):
  1、affinity就是我們使用android:taskAffinity設定的值。不同的Task是可以重復的,例如我們使用singleInstance啟動模式時,activity單獨占一個Task,Task的affinity可能和和相同進程中其他activitiy啟動的Task一致,但是Task的id是不一致的。
  2、launchMode為默認的時候,activity會運行在啟動它的task中,不論兩個activity是不是同一個應用。
  3、launchMode為singleInstance時,不論是不是同一個應用,都會是一個單獨的Task,且其中只有一個Activity,
  4、launchMode為singleTask時,會依據affinity找到對應的Task,不存在則新建,存在則切換到該Task。然後看有沒有該activity實例,有則清空上面的顯示,沒有則新建。

個人理解:
  1、Stack只有兩個,一個是系統的Launcher占用,一個是我們啟動的應用占用的。點擊Home鍵其實是這兩個Stack交替。
  2、每個Activity都有一個affinity,默認會是所在應用的包名。
  3、啟動一個Activity,首先有一個當前的Task,然後依據啟動模式,選擇是在當前Task添加,還是尋找新的Task。
  4、 standard:新建實例。當前Task能添加則添加。如:當前Task中的Activity如果是singleInstance則會依據affinity尋找對應Task添加。
    singleTop:和standard一樣的步驟找到可添加的Task,然後看頂部的Activity是不是要啟動的Activity。
    singleTask:依據affinity找到可添加的Task,然後看Task中是不是有要啟動的Activity實例。
    singleInstance:依據affinity查找,是否存在只有要啟動的activity的實例的Task,切換到該Task。

  主要是對任務棧的機構有了一個新的認識。

android的activity任務棧