Android提供了四種啓動模式,分別是:android
標準模式(Standard)bash
棧頂複用模式(SingleTop)數據結構
棧內複用模式(SingleTask)函數
單例模式(SingleInstance)this
下面依次介紹每種模式的特色,首先了解什麼是task,task翻譯過來就是「任務」,是一組相互有關聯的Activity集合,能夠理解爲Activity是在task裏面活動的。task存在於一個稱爲back stack的數據結構中,也就是說,task是以 棧的形式去管理Activity的,因此也叫能夠稱爲「任務棧」。綜上所述:「任務棧」是Activity的管理方式,採用的是「後進先出」的棧結構,每按一次Back鍵,就會有一個Activity出棧spa
標準模式,也是系統默認的啓動模式,該模式特色:翻譯
每啓動一次Activity,都會建立一個新的Activity實例在棧頂,無論這個實例在任務棧中是否已經存在。假如 Activity A啓動了 Activity B,Activity B則會運行在Activity A所在的任務棧中並處於棧頂位置。code
非Activity類型的context(如ApplicationContext)啓動standard模式的Activity時會報錯。由於非Activity類型 context 並無任務棧,故沒法採用標準模式啓動Activity。解決辦法能夠爲待啓動Activity指定 FLAG_ACTIVITY_NEW_TASK標記位,這樣啓動的時候系統就會爲它建立一個新的任務棧。實際上待啓動Activity是採用singleTask模式啓動的。cdn
棧頂複用模式,該模式特色:xml
若須要新建的Activity位於任務棧棧頂,那麼此Activity的實例就不會從新建立,而是複用棧頂的實例。調用Activity的onNewIntent()方法不會調用onCreate()和onStart()方法。
假如Activity A啓動Activity B,就會判斷A所在的任務棧棧頂是不是B的實例。若是是,則不建立新的Activity B 實例而是直接引用棧頂實例,同時onNewIntent()方法會被回調,經過該方法的參數能夠取得當前請求的信息;若是不是,則建立新的Activity B實例。
棧內複用模式,該模式特色:
. 查看Activity想要的任務棧是否存在(經過查找Activity的taskAffinity屬性值相匹配的任務棧是否存在),若不存在,則新建一個任務棧並建立該Activity實例壓入棧中;若存在,則查看Activity是否在該棧中,若在,則將該Activity實例之上的全部Activity實例出棧,使該Activity實例置於棧頂,執行回調函數onNewIntent()方法。若不在,則建立該Activity實例並壓入棧中。
單實例模式,該模式特色:
這個是singleTas模式的增強版,它除了具備singleTask模式的全部特性外,它還有一點獨特的特性,那就是此模式的Activity只能單獨地位於一個任務棧,不與其 Activity共存於同一個任務棧。
直接建立一個新的任務棧並建立該Activity實例壓入棧中。
兩種方法能給Activity指定啓動模式:
<activity
android:name=".MainActivity"
android:launchMode="singleTask">
</activity>
複製代碼
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
複製代碼
經常使用Activity的標誌位Flags有:
標 志 位 | 做 用 |
---|---|
FLAG_ACTIVITY_SINGLE_TOP | 指定啓動模式爲棧頂複用模式(SingleTop) |
FLAG_ACTIVITY_CLEAR_TOP | 在同一個任務棧中,全部位於它上面的Activity都要出棧。在下面詳細介紹下 |
FLAG_ACTIVITY_NEW_TASK | 指定啓動模式爲棧內複用模式(SingleTask) |
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | 具備這個標記的Activity不會出如今歷史Activity的列表中,即沒法經過歷史列表回到該Activity中,它等同於在XML中指定Activity 的屬性 android:excludeFromRecents="true" |
FLAG_ACTIVITY_CLEAR_TOP
若是該Activity已經在存在任務棧中,系統會將同一個任務棧中,該Activity之上的全部Activity都出棧,而後將Intent發給這個已存在的Activity,該Activity收到Intent以後,執行回調onNewIntent()方法或者自行結束而後從新建立本身。
優先級不一樣:Intent設置方式的優先級 > Manifest設置方式,即之前者爲準
限定範圍不一樣Manifest設置方式沒法設定FLAG_ACTIVITY_CLEAR_TOP;Intent設置方式沒法設置單例模式(SingleInstance)
本文介紹了Activity的四種啓動模式(standard、singleTop、singleTask、singleNewInstance)和設置啓動模式的方法(launchMode、Intent_Flag)