Activity啓動模式和onNewIntent調用時機

onNewIntent()的調用時機

在瞭解onNewIntent()的調用時機之前,我們首先需要對Android中Activity的加載模式做一個瞭解:
在Android開發中,我們都知道,在默認的情況下,如果我們啓動的是同一個Activity的話,系統會創建多個實例並把它們一一放入任務棧中。當我們點擊返回(back)鍵,這些Activity實例又將從任務棧中一一移除,遵循的原則是“後進先出”(先進後出)的原則。
如果Activity沒有啓動模式的概念,那麼多次啓動一個Activity就會產生多個實例,造成了內存資源的浪費,這也就是爲何會有啓動模式存在。

四種啓動模式

  • standard(標準模式):這種啓動模式爲標準模式,也是默認模式。每當我們啓動一個Activity,系統就會相應的創建一個實例,不管這個實例是否已經存在。這種模式,一個棧中可以有多個實例,每個實例也都有自己的任務棧。而且是誰啓動了此Activity,那麼這個Activity就運行在啓動它的Activity所在的棧中。
  • singleTop(棧頂複用模式):這種啓動模式下,如果要啓動的Activity已經處於棧的頂部,那麼此時系統不會創建新的實例,而是直接打開此頁面,同時它的onNewIntent()方法會被執行,我們可以通過Intent進行傳值,而且它的onCreate(),onStart()方法不會被調用,因爲它並沒有發生任何變化。若該Activity在任務棧中的實例不在棧頂,或者無實例在該任務棧,其啓動模式同standard模式。
  • singleTask(棧內複用模式):在這個模式下,如果棧中存在這個Activity的實例就會複用這個Activity,不管它是否位於棧頂,複用時,會將它上面的Activity全部出棧,因爲singleTask本身自帶clearTop這種功能。並且會回調該實例的onNewIntent()方法。其實這個過程還存在一個任務棧的匹配,因爲這個模式啓動時,會在自己需要的任務棧中尋找實例,這個任務棧就是通過taskAffinity屬性指定。如果這個任務棧不存在,則會創建這個任務棧。不設置taskAffinity屬性的話,默認爲應用的包名。

注意以下幾點:
在複用的時候,首先會根據taskAffinity去找對應的任務棧:
1、如果不存在指定的任務棧,系統會新建對應的任務棧,並新建Activity實例壓入棧中。
2、如果存在指定的任務棧,則會查找該任務棧中是否存在該Activity實例
a、如果不存在該實例,則會在該任務棧中新建Activity實例。
b、如果存在該實例,則會直接引用,並且回調該實例的onNewIntent()方法。並且 任務棧中該實例之上的Activity會被全部銷燬。常用於App啓動頁面。

  • singleInstance(單實例模式):單實例模式,顧名思義,只有一個實例。該模式具備singleTask模式的所有特性外,與它的區別就是,這種模式下的Activity會單獨佔用一個Task棧,具有全局唯一性,即整個系統中就這麼一個實例,由於棧內複用的特性,後續的請求均不會創建新的Activity實例,除非這個特殊的任務棧被銷燬了。以singleInstance模式啓動的Activity在整個系統中是單例的,如果在啓動這樣的Activiyt時,已經存在了一個實例,那麼會把它所在的任務調度到前臺,重用這個實例。

以上啓動模式只需在Manifest文件中配置即可:

<activity
    android:name=".SingleInstanceActivity"
    android:launchMode="singleInstance">
</activity>

講完Androidz中Activity的啓動模式,我們就可以很輕易的回答上面的問題:

ActivityA已經啓動過,處於當前應用的Activity任務棧中:
當ActivityA的LaunchMode爲SingleTop時,如果ActivityA在棧頂,且現在要再啓動ActivityA,這時會調用onNewIntent()方法。

當ActivityA的LaunchMode爲SingleInstance,SingleTask時,如果ActivityA已經在任務棧中,那麼此時會調用onNewIntent()方法。

當ActivityA的LaunchMode爲Standard時,由於每次啓動ActivityA都是啓動新的實例,和原來啓動的沒關係,所以不會調用原來ActivityA的onNewIntent方法,仍然調用的是onCreate方法

onNewIntent()的使用場景:讓後臺運行的Activity回到前臺並傳遞一些數據時,可在該生命週期方法裏做一些邏輯處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章