Android的啓動模式

  爲了滿足項目的特殊需要,就必須使用Activity的啓動模式,而Activity的啓動模式是由標誌位設定的,雖然太多的標誌位讓程序員們深惡痛絕,但還是靠他們吃飯的,有必要搞清楚他們。

   啓動模式在英文中是LaunchMode。在默認情況下,我們多次啓動同一個Activity的時候,系統會重複創建多個實例並把他們一一放入任務棧中,上一篇在Activity的生命週期中已經介紹過。當用戶點擊backActivity便會一一回退,按照後進先出的順序一一出棧。可是重複創建不是很傻嗎?所以Android提供了啓動模式來修改系統的默認行爲。目前的啓動模式有四種,分別是:standardsingleTopsingleTasksingleInstance。下面一一介紹他們的奧祕:

     (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處於暫停狀態。

舉個栗子:有AB兩個應用,A啓動了B的一個Activity C;由於是A啓動的C,這個時候C只能運行在A的任務棧中,但是呢,C又屬於B,正常情況下CTaskAffinity是不可能和A相同的。所以當B啓動後,B會創建自己的任務棧,這時系統就把CA的任務棧轉移過來了。

  指定Activity的啓動模式有兩種方法:

    ·通過AndroidMenifest.xml指定 。EgandroidlaunchMode=singleTask

     ·在Intent中設置標誌位。    Egintent.addFlagsIntent.FLAG_ACTIVITY_NEW_TASK);

     後者的優先級要高於前者。如果你想要驗證一下,可以執行adb shell dumpsys activity命令查看。至於每種模式標誌位這裏不再一一舉例,百度百科已經幫我們解決了。標誌位很好理解。

發佈了29 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章