Android 探究Activity的啓動模式

  我們知道,在默認情況下,當我們多次啓動同一個Activity的時候,系統會重複創建多個實例。Android在設計的時候提供了啓動模式來修改系統的默認行爲。目前有四種啓動模式:standard、singleTop、singleTask和singleInstance。


一、standard(標準模式)

  這是系統的默認模式,每次啓動Activity都會重新創建一個新的實例,不管這個實例是否已經存在。被創建的實例的生命週期,它的onCreate、onStart、onResume都會被調用。這是一種典型的多實例實現,一個任務棧中可以有多個實例,每個實例也可以屬於不同的任務棧。在這種模式下,誰啓動了這個Activity,那麼這個Activity就運行在啓動它的那個Activity所在的棧中。
  

這裏寫圖片描述
  

二、singleTop(棧頂複用模式)

  在這種模式下,如果新Activity已經位於任務棧的棧頂,那麼此Activity不會被重新創建,同時它的onNewIntent方法會被回調,通過此方法的參數我們可以取出當前請求的信息。需要注意的是,這個Activity的onCreate、onStart不會被系統調用,因爲它並沒有發生改變。如果新Activity的實例已存在但不是位於棧頂,那麼新Activity仍然會重新創建。
  

這裏寫圖片描述
  

三、singleTask(棧內複用模式)

  這是一種單實例模式,在這種模式下,只要Activity在一個棧中存在,那麼多次啓動此Activity都不會重新創建實例,和singleTop一樣,系統也會回調其onNewIntent。具體一點,當一個具有singleTask模式的Activity請求啓動後,比如Activity A,系統首先會尋找是否存在A想要的任務棧,如果不存在,就重新創建一個任務棧,然後創建A的實例後把A放到棧中。如果存在A所需的任務棧,這時要看A是否在棧中有實例存在,如果有實例存在,那麼系統就會把A調到棧頂並調用它的onNewIntent方法,如果實例不存在,就創建A的實例並把A壓入棧中。
  

這裏寫圖片描述
  

四、singleInstance(單實例模式)

  這是一種加強的singleTask模式,它除了具有singleTask模式的所有特性外,還加強了一點,那就是具有此模式的Activity只能單獨地位於一個任務棧中,換句話說,比如Activity A是singleInstance模式,當A啓動後,系統會爲它創建一個新的任務棧,然後A獨自在這個新的任務棧中,由於棧內複用的特性,後續的請求均不會創建新的Activity,除非這個獨特的任務棧被系統銷燬了。
  

這裏寫圖片描述

使用方法

  一、通過AndroidMenifest爲Activity指定啓動模式:android:launchMode="singleTask"
  二、通過在Intent中設置標誌位來爲Activity指定啓動模式 : intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  
  這兩種方法都可以爲Activity指定啓動模式,但是二者還是有區別的。首先,優先級上,第二種方式的優先級要高於第一種,當兩種同時存在時,以第二種爲準;其次,上述兩種方式在限定範圍上有所不同,比如,第一種方式無法直接爲Activity設定FLAG_ACTIVITY_CLEAR_TOP標識 ,而第二種方式無法爲Activity指定singInstance模式。


結束語

  沒有任何動物比螞蟻更勤奮,然而它卻最沉默寡言 —— 富蘭克林

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