Android 啓動模式LaunchMode詳解(LaunchMode四種模式詳解)

1、Android 啓動模式LaunchMode

  • Standard:標準模式,也是系統默認的啓動模式。每次啓動都會建立一個新的Activity實例,無論這個實例在棧中是否已經存上。Activity所在的任務棧爲啓動新Activity B的Activity A所在任務棧。具體就是Activity A所在的任務棧爲S1,Activity A啓動Activity B,那麼Activty B的實例被建立後,會將Activity B的實例壓入任務棧S1中。
  • SingleTop:棧頂複用模式。在這種啓動模式下,若是新Activity已經在任務棧的棧頂,那麼,將不會從新建立新Activity,同時onNewIntent(...)方法被回調,經過此方法參數能夠獲取到請求信息。須要注意的是此Activity的onCreate(...)和onStart(...)方法也不會被調用。好比:有四個Activity,分別爲ABCD,Activity D的LaunchMode是SingleTop模式;
    • 若是,在任務棧中四個Activity的排列是ABCD的順序,此時,啓動Activity D,因爲Activity D位於任務棧棧頂,那麼就不會建立Activity D實例,系統會調用Activity D的onNewIntent(...)方法。此時,Activity在任務棧中的順序依然是ABCD。
    • 若是,在任務棧中四個Activity的排列是ADBC的順序,此時,啓動Activity D,因爲Activity D沒有位於任務棧棧頂,那麼,就會建立Activity D的新實例,並壓下任務棧中。此時,Activity在任務棧中的順序是ADBCD。
  • SingleTask:棧內複用模式。這是一種單實例模式,在這種模式下,只要Activity在一個任務棧中存在,那麼屢次啓動此Activity都不會建立新的實例,和SingleTop同樣,系統會調用其onNewIntent(...)方法。具體一點就是,有一個Activity A,並啓動Activity A。首先尋找Activity A所需的任務棧,若是任務棧不存在,則建立任務棧並將Activity A壓入棧中。若是Activity A所需的任務棧已經存在,則看Activity A在任務棧中,是否存在實例,若是不存在實例,就會建立新的實例並壓入棧中;若是Activity A實例在已經存在的任務棧中,則將Activity A的實例調到棧頂,因爲SingleTask有clearTop效果,在Activity A實例之上的全部Activity都會被出棧,直至Activity A到棧頂爲止。好比:有四個Activity,分別爲ABCD,而且Activity B的launchMode爲SingleTask,此時啓動Activity B。
    • 若是,Activity B所需的任務棧不存在,此時會建立其任務棧S1並將Activity B壓入棧中。
    • 若是,Activity B所需的任務棧S1已經存在,此時會在任務棧S1中查看Activity B的實例是否在棧中存在。假如,Activity B的實例在任務棧S1中存在,而且當前任務棧中已經存在幾個Activity,在任務棧中的排列爲ABCD,那麼,此時啓動Activity B,不會再建立Activity B的實例,系統會調用其Activity B的onNewIntent(...)方法。而且將Activity B調至棧頂,因爲SingleTask有clearTop效果,CD兩個Activity會被出棧,直至Activity B被調到棧頂。
    • 若是,Activity B所需的任務棧S1已經存在,此時會在任務棧S1中查看是否存在Activity B的實例,若是不存在,則在任務棧S1中建立Activity B的實例,並壓入任務棧S1中。
  • SingleInstance:單實例模式。這是一種增強版的SingleTask模式,它除了具備SingleTask的全部特性外,還增強了一點,就是具備此模式的Activity只能單獨位於一個任務棧中。換句話說就是,一個Activity B是SingleInstance模式,在啓動Activity B時,會建立Activity B所需的任務棧S2,並將Activity B壓入棧中,而且這個任務棧S2,只會有一個Activity,那就是Activity B。因爲棧內複用模式,再次啓動Activity B時,均不會再建立Activity B的實例,系統會調用Activity B的onNewIntent(...)方法。除非,Activity B所需的任務棧S2被系統銷燬,不然不會再建立Activity B的實例。

  PS:Android App在建立任務棧時,默認使用的是包名爲任務棧名稱,當前也能夠自定義指定任務棧名稱,好比:android

1 <activity
2             android:name=".SecondActivity"
3             android:launchMode="singleInstance"
4             android:taskAffinity="com.example.task.task.SecondActivity11"
5             android:allowTaskReparenting="true"/>

 

  其中,屬性taskAffinity與allowTaskReparenting是配合使用的,taskAffinity指定任務棧名稱。屬性taskAffinity只有在SingleTask和SingleInstance模式下有效。spa

相關文章
相關標籤/搜索