天天看點

android launchmode

1: standard:标準啟動模式(預設啟動模式),每次都會啟動一個新的activity執行個體。

2: singleTop:單獨使用使用這種模式時,如果 Activity執行個體位于目前任務棧頂,就重用棧頂執行個體,而不建立,并回調該執行個體 onNewIntent()方法,否則走建立流程。 适合接收通知啟動的内容顯示頁面。例如,某個新聞用戶端的新聞内容頁面,如果收到10個新聞推送,每次都打開一個新聞内容頁面是很煩人的。

3: singleTask:這種模式啟動的Activity 隻會存在相應的Activity的taskAffinit任務棧中,同一時刻系統中隻會存在一個執行個體,已存在的執行個體被再次啟動時,會重新喚起該執行個體,并清理目前Task任務棧該執行個體之上的所有Activity,同時回調onNewIntent()方法。 适合作為程式入口點, 例如浏覽器的主界面。不管從多少個應用啟動浏覽器,隻會啟動主界面一次,其餘情況都會走onNewIntent,并且會清空主界面上面的其他頁面;

4:singleInstance:這種模式啟動的Activity獨自占用一個Task任務棧,同一時刻系統中隻會存在一個執行個體,已存在的執行個體被再次啟動時,隻會喚起原執行個體,并回調onNewIntent()方法。 鬧鈴的響鈴界面。 你以前設定了一個鬧鈴:上午6點。在上午5點58分,你啟動了鬧鈴設定界面,并按 Home 鍵回桌面;在上午5點59分時,你在微信和朋友聊天;在6點時,鬧鈴響了,并且彈出了一個對話框形式的 Activity(名為 AlarmAlertActivity) 提示你到6點了(這個 Activity 就是以 SingleInstance 加載模式打開的),你按傳回鍵,回到的是微信的聊天界面,這是因為 AlarmAlertActivity 所在的 Task 的棧隻有他一個元素, 是以退出之後這個 Task 的棧空了。如果是以 SingleTask 打開 AlarmAlertActivity,那麼當鬧鈴響了的時候,按傳回鍵應該進入鬧鈴設定界面。

上面的場景僅僅适用于Activity啟動Activity,并且采用的都是預設Intent,沒有額外添加任何Flag,否則表現就可能跟上面的完全不一緻,尤其要注意的是FLAG_ACTIVITY_NEW_TASK的使用,後面從源碼中看,依靠FLAG_ACTIVITY_NEW_TASK其實可以分為兩派;