1. 程式人生 > >Activity四種啟動模式的利用場景

Activity四種啟動模式的利用場景

一.singleTask:

需求說明: 如果自己的客戶端處於執行狀態,按下Home鍵後臺掛起。此時如果使用微信調起自己的客戶端某 個頁面,不做任何處理的情況下,按下回退或者當前 Activity.finish(),頁面都會停留在自己的客戶端(因為自己的Application回 退棧不為空),這明顯不符合邏輯的。產品的要求 是,回退必須回到微信客戶端,而且要保證不殺死自己的Application.

處理方案: 設定當前 被調起Activity的屬性 為:LaunchMode=""SingleTask"  taskAffinity="com.tencent.mm"(com.tencent.mm 是藉助於工具找到的微信包名),就是把自己的 Activity放到微信預設的Task棧裡面,這樣回退時就會遵循“Task只要有Activity一定 從本Task剩餘Activity回退"的原 則,不會回到自己的客戶端,而且也不會影響自己客戶端本來的Activity和Task邏輯。

其他:

創 建兩個工程application1和application2,分別含有Activity1和Activity2,其taskAffinity相 同,Activity1的allowTaskReparenting為true。首先,我們啟動application1,載入Activity1,然後 按Home鍵,使該task(假設為task1)進入後臺。然後啟動application2,預設載入Activity2。我們看到了什麼現象?沒錯, 本來應該是顯示Activity2,但是我們卻看到了Activity1。實際上Activity2也被載入了,只是Activity1重新宿主,所以看 到了Activity1。

我們首先啟動APP1的MyActivity,然後按Home鍵,返回到桌面,然後開啟APP2的Activity2,點選Activity2,進入Activity1(Flag被設定成FLAG_ACTIVITY_NEW_TASK,taskAffinity與MyActivity同)。然後按返回鍵。我們發現,我們進入Activity的順序為Activity2->Activity1,而返回時順序為 Activity1->MyActivity。這是因為:啟動Activity1時,其會首先檢查是否存在與自己taskAffinity相同的Task,如果存在,那麼它會直接宿主到該Task中,本例中就宿主到MyActivity的棧中了,如果不存在則重新建立Task。

測試示例:

1.清單檔案中,對Activity B設定LaunchMode=""SingleTask"和taskAffinity後,則 B 是在新 task 中建立的,若將taskAffinity指定為APP 2 的包名且APP 2未做相關防範處理的話,則跳轉到 B 後按 HOME 進入後臺,這時開啟APP 2,發現顯示 B,按回退則退出 APP 2,再次開啟APP 2則顯示其入口Activity。

2.清單檔案中,對Activity B設定LaunchMode=""SingleTask"和taskAffinity後,則 B 是在新 task 中建立的,再由 B 跳轉到一個普通的Activity C,則 C 也在 B 的棧中;

3.FLAG_ACTIVITY_NEW_TASK標記,不一定會啟動一個新的棧,其策略是:先查詢有沒有和這個Activity的affinity相同的task棧,如果有,則直接在這個task棧裡啟動,沒有才建立一個新的task棧。

4.點選APP 圖示時,系統將尋找root Activity所處的那個task,其中有 Activity則不會再創見入口Activity。

二.singleInstance

結論:

1.以singleInstance模式啟動的Activity具有全域性唯一性,即整個系統中只會存在一個這樣的例項。

2.以singleInstance模式啟動的Activity在整個系統中是單例的,如果在啟動這樣的Activiyt時,已經存在了一個例項,那麼會把它所在的任務排程到前臺,重用這個例項。

3.以singleInstance模式啟動的Activity具有獨佔性,即它會獨自佔用一個任務,被他開啟的任何activity都會執行在其他任務中。

4.被singleInstance模式的Activity開啟的其他activity,能夠在新的任務中啟動,但不一定開啟新的任務,也可能在已有的一個任務中開啟。

測試示例:

1.清單檔案中,對Activity B設定LaunchMode="singleInstance",B 跳轉到僅設定了taskAffinity的 C,則 C 的所在棧即為其taskAffinity所指定。