android的activity任務棧


  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。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM