Android進階(二)Activity的啟動模式

在上篇文章中我們介紹了Activity的生命周期,那么接下來就要介紹同樣是重點而且是難點的Activity的啟動模式!

說到啟動模式,對于很多初學者來說,可能僅僅只是聽說過這種概念而已,并沒有親自驗證過每個啟動模式有什么不同!在詳細介紹每個啟動模式之前,我們有必要了解一下啟動模式為什么會出現,它的意義是什么?我們都知道,在正常情況下,每啟動一個Activity,系統都會創建一個實例,并把實例放到任務棧中,那么當我們多次啟動同一個Activity時,系統依然這么做,是不是就不合理了,我們都能想到的問題,Google的大牛們咋么會想不到呢,于是乎就有了啟動模式的出現,通過啟動模式我們可以去修改系統的這種行為。
啟動模式有四種,分別是:standard,singleTop,singleTask和singleInstance,接下來會分別詳細的介紹每種啟動模式的含義以及行為。

standard:標準模式
標準模式,顧名思義,就是在默認情況下Activity的啟動模式,也就是我們上文所提到的每次啟動一個Activity,都會重新創建一個新的實例,并把該實例添加到任務棧中。被創建的Activity的生命周期符合典型情況下Activity的生命周期。在標準模式下,誰啟動了Activity,那么這個Activity就運行在啟動它的那個Activity所在的棧中。舉個簡單的例子,假如Activity A啟動了ActivityB,那么B就會和A在相同的棧中。注意:當我們用ApplicationContext去啟動standard模式的Activity的時候會報錯,錯誤如下:AndroidRuntime:android.util.AndroidRuntimeException:Calling startActivity from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
這個錯誤應該好多初學者都會碰到,特別是不按套路出牌的初學者(這樣就對了),這是因為標準模式的Activity默認會進入啟動它的Activity所在的任務棧,但是由于非Activity類型的Context(如ApplicationContext)并沒有所謂的任務棧,所以就會有這個問題了,那么怎么解決呢,其實也很簡單,新建一個任務棧就可以了,怎么新建一個任務棧呢,需要添加一個標記位FLAG_ACTIVITY_NEW_TASK,添加完標記位后,啟動Activity的時候就會為它創建一個新的任務棧。但是此時Activity實際上是以singleTask模式啟動。

singleTop:棧頂復用模式
這種模式,就是說如果啟動一個Activity,該Activity正好又位于棧頂,這時此Activity就不會被重建,同時它的onNewIntent(Intent intent)方法將會被調用,通過該方法,就可以獲取當前請求的信息(通過intent傳遞過來的數據)。而此時該Activity的onCreate()方法和onStart()方法是不會執行的。但是如果被啟動的Activity不位于棧頂,那么該Activiy還是會被重建。

singleTask:棧內復用模式
這是一種單實例模式,在這種模式下,只要Activity在一個棧(任何棧一個)中存在,那么多次啟動該Activity都不會創建新的實例,并且onNewIntent(Intent intent)方法會被調用。舉例,假如ActivityA是singleTask模式,那么當ActivityA的請求啟動后,系統首先會尋找是否存在A想要的任務棧,如果不存在,就重新創建一個任務棧,然后創建A的實例把A放到棧中。如果存在A所需的任務棧,就要看棧中是否有A的實例,如果實例存在,系統會把A調到棧頂并調用它的onNewIntent()方法,如果過實例不存在,就創建A的實例,并把A壓入棧中。

singleInstance:單實例模式
該模式是在singleTask模式上進行了進一步的加強,具有此模式的Activity只能單獨的位于一個任務棧中。舉個例子,比如ActivityA是singleInstance模式,當A啟動后,系統會為它創建一個新的任務棧,然后A獨自在這個新的任務棧中,由于棧內復用的特性,后續的請求均不會創建新的Activity,除非這個獨特的任務棧被系統銷毀了。
介紹完啟動模式之后,接下來就說說如何在項目中使用啟動模式。給Activity設置啟動模式主要有兩種方式,第一種在AndroidMenifest文件中設置。如下圖所示。

第一種方式

第二種方式是通過設置標志位來為Activity指定啟動模式:

第二種方式

這兩種方式都可以為Activity指定啟動模式,但是二者還是有區別的。優先級上第二種方式(即通過標記位)的方式要高于第一種方式,當兩種方式同時存在時,以第二種方式為準。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容