轉載請註明出處:http://blog.csdn.net/zhouli_csdn/article/details/45645743
看了網上的博客關於launchmode的介紹自己感覺很凌亂,總結性不強(可能自己沒找到好的文章),於是自己親自動手寫了兩個應用A和B測試:
本人一下內容都經過實際的測試:(通過兩個應用測試)
standard:每次都會新建,每個Task都可以有,且每個Task都可以有多個實例(每個Task都可以有,且可以有多個)
singleTop:當前實例如果在棧頂,就不新建實例,調用其OnNewIntent。 如不在棧頂,則新建實例 (每個Task都可以有,且可以有多個,在棧頂時可複用)
以上兩種模式比較簡單。
假設兩個應用A和B(A的主activity爲m1,singleTop爲m2,singleTask爲m3,singleInstance爲m4,;B的主activity爲n1)返回鍵會使應用退出task
singleTask:新建一個Task,如果已經有其他的Task並且包含該實例,那就直接調用那個Task的實例。(只有一個Task中會有)
1)該實例只會存在A應用Task中,如果A應用沒有創建,那麼會創建一個新的task,此時按home鍵退出,並且A自己啓動的時候發現A的主頁面並沒有啓動而是直接打開該task的m3頁面。
2)A應用已經啓動且m3存在實例,並且m3上面還有其它的activity,那麼如果從本應用或者其它應用再次打開m3時,m3上面的activity都會銷燬。
onNewIntent()非常好用,Activity第一啓動的時候執行onCreate()---->onStart()---->onResume()等後續生命週期函數,也就時說第一次啓動Activity並不會執行到onNewIntent().
而後面如果再有想啓動Activity的時候,那就是執行onNewIntent()---->onResart()------>onStart()----->onResume(). 如果android系統由於內存不足把已存在Activity釋放掉了,那麼再次調用的時候會重新啓動Activity即執行onCreate()---->onStart()---->onResume()等。
singleInstance:新建一個Task,且在該Task中只有它的唯一一個實例。 (只有一個Task會有,且該Task中只有它)
1)m4不會存在與其主應用A中,也不會存在於打開它的應用B中,m4單獨存在於一個task中。
2)B應用打開後,打開m4,如果m4不存在,那麼會新建一個task,此時如果按home鍵,啓動A應用會啓動A自身的task。
3)如果想啓動m4,可以在task列表中發現,會有三個task存在,且m4單獨存在一個task中。
總結:
1)每一個應用都有一個以其主Activity爲root的task堆棧。
2)SingleInstance會單獨的擁有一個task,不依賴於任何應用的task。(如果A、B應用均已啓動,m4也啓動,那麼系統現在會有三個task,可以查看task列表)
3)SingleTask依賴於自己應用的Task,只會存在於自身的應用當中。(且如果A應用之前沒有啓動過,那麼如果此task沒有退出,啓動A應用時,m3會作爲應用task的root存在,這意味着A的主activity得不到執行)
4)singleTask會結束自己上面的activity。
5)B啓動singleTask,會將A應用task移到B的上面來,變爲可見task。
6)啓動standared和singleTop模式的activity,都只會在自身的task中創建該實例。
7)這次測試發現,系統每次新建一個task都會在之前的基礎上加一。(taskid會越來越大)
應用場景暫時略掉
下面用圖解釋上面的總結: