爲了滿足項目的特殊需要,就必須使用Activity的啓動模式,而Activity的啓動模式是由標誌位設定的,雖然太多的標誌位讓程序員們深惡痛絕,但還是靠他們吃飯的,有必要搞清楚他們。
啓動模式在英文中是LaunchMode。在默認情況下,我們多次啓動同一個Activity的時候,系統會重複創建多個實例並把他們一一放入任務棧中,上一篇在Activity的生命週期中已經介紹過。當用戶點擊back,Activity便會一一回退,按照後進先出的順序一一出棧。可是重複創建不是很傻嗎?所以Android提供了啓動模式來修改系統的默認行爲。目前的啓動模式有四種,分別是:standard,singleTop,singleTask,singleInstance。下面一一介紹他們的奧祕:
(1) standard:標準模式,
這也是系統的默認模式,即每啓動一次Activity就會創建一個實例。這話典型的多實例實現。在這種模式下,誰啓動了這個Acticity,那麼這個Activity就在啓動他的那個Activity所在的任務棧中。但是當我們用ApplicationContext啓動standard模式的Activity的時候會報錯,那是因爲Context不是Activity類型,沒有作爲的任務棧。解決的辦法是爲Activity指定FLAG_ACTIVItY_NEW_TASK標誌位,啓動他的時候就會創建一個新的任務棧。
(2) singleTask:棧頂複用模式。
也就是如果新Activity已經位於任務棧的棧頂,那麼該Activity就不會重新創建。否則,依然重建。
(3) singleTask:棧內複用模式。
這是一種單實例模式,這種模式下,只要Activity在它想要的棧內存在,那麼都不會被重建,因爲singleTask具有clearTop效果,會導致所有棧內在該Activity之前的Activity全部出棧,最後該Activity位於棧頂。如果不存在Acticity請求的棧,就會創建任務棧並將Activity入棧。
(4) singleInstance:單實例模式,
它是一種加強的singleTask模式,他除了具有singleTask所有的特性外,該模式的Activity只能單獨位於一個任務棧中。也就是,該模式的Activity啓動後,系統會爲他創建一個新的任務棧,由於它具有棧內複用的特性,以後多不會創建他的實例,除非這個任務棧被系統銷燬了。
那麼什麼時任務棧,爲什麼需要任務棧呢?
這就要需要從一個參數說起:TaskAffinity,按中文翻譯就是任務相關性,它標識的是Activity所需要任務棧的名字,默認情況下都是包名,當然我們可以單獨指定。任務棧分爲前臺任務棧和後臺任務棧。後臺任務棧中的Activity處於暫停狀態。
舉個栗子:有A和B兩個應用,A啓動了B的一個Activity C;由於是A啓動的C,這個時候C只能運行在A的任務棧中,但是呢,C又屬於B,正常情況下C的TaskAffinity是不可能和A相同的。所以當B啓動後,B會創建自己的任務棧,這時系統就把C從A的任務棧轉移過來了。
指定Activity的啓動模式有兩種方法:
·通過AndroidMenifest.xml指定 。Eg:android:launchMode=“singleTask”
·在Intent中設置標誌位。 Eg:intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
後者的優先級要高於前者。如果你想要驗證一下,可以執行adb shell dumpsys activity命令查看。至於每種模式標誌位這裏不再一一舉例,百度百科已經幫我們解決了。標誌位很好理解。