Activity的啓動模式

1、概述

Android提供了四種啓動模式,分別是:android

標準模式(Standard)bash

棧頂複用模式(SingleTop)數據結構

棧內複用模式(SingleTask)函數

單例模式(SingleInstance)this

下面依次介紹每種模式的特色,首先了解什麼是task,task翻譯過來就是「任務」,是一組相互有關聯的Activity集合,能夠理解爲Activity是在task裏面活動的。task存在於一個稱爲back stack的數據結構中,也就是說,task是以 棧的形式去管理Activity的,因此也叫能夠稱爲「任務棧」。綜上所述:「任務棧」是Activity的管理方式,採用的是「後進先出」的棧結構,每按一次Back鍵,就會有一個Activity出棧spa

2、四種啓動模式具體特色

(一)Standard

標準模式,也是系統默認的啓動模式,該模式特色:翻譯

  1. 每啓動一次Activity,都會建立一個新的Activity實例在棧頂,無論這個實例在任務棧中是否已經存在。假如 Activity A啓動了 Activity B,Activity B則會運行在Activity A所在的任務棧中並處於棧頂位置。code

  2. 非Activity類型的context(如ApplicationContext)啓動standard模式的Activity時會報錯。由於非Activity類型 context 並無任務棧,故沒法採用標準模式啓動Activity。解決辦法能夠爲待啓動Activity指定 FLAG_ACTIVITY_NEW_TASK標記位,這樣啓動的時候系統就會爲它建立一個新的任務棧。實際上待啓動Activity是採用singleTask模式啓動的。cdn

(二)SingleTop

棧頂複用模式,該模式特色:xml

  1. 若須要新建的Activity位於任務棧棧頂,那麼此Activity的實例就不會從新建立,而是複用棧頂的實例。調用Activity的onNewIntent()方法不會調用onCreate()和onStart()方法。

  2. 假如Activity A啓動Activity B,就會判斷A所在的任務棧棧頂是不是B的實例。若是是,則不建立新的Activity B 實例而是直接引用棧頂實例,同時onNewIntent()方法會被回調,經過該方法的參數能夠取得當前請求的信息;若是不是,則建立新的Activity B實例。

(三)SingleTask

棧內複用模式,該模式特色:

. 查看Activity想要的任務棧是否存在(經過查找Activity的taskAffinity屬性值相匹配的任務棧是否存在),若不存在,則新建一個任務棧並建立該Activity實例壓入棧中;若存在,則查看Activity是否在該棧中,若在,則將該Activity實例之上的全部Activity實例出棧,使該Activity實例置於棧頂,執行回調函數onNewIntent()方法。若不在,則建立該Activity實例並壓入棧中。

  1. taskAffinity是在Androidmanifest文件中的一個重要屬性,這個參數標識了一個Activity所須要的任務棧的名字。默認狀況下,全部Activity所需的任務棧的名字爲應用的包名。taskAffinity屬性主要和singleTask啓動模式或者allowTaskReparenting屬性配對使用。

(四)SingleInstance

單實例模式,該模式特色:

  1. 這個是singleTas模式的增強版,它除了具備singleTask模式的全部特性外,它還有一點獨特的特性,那就是此模式的Activity只能單獨地位於一個任務棧,不與其 Activity共存於同一個任務棧。

  2. 直接建立一個新的任務棧並建立該Activity實例壓入棧中。

3、啓動模式的設置

兩種方法能給Activity指定啓動模式:

  1. 在AndroidMainifest設置LaunchMode
  2. 經過Intent設置標誌位Intent Flag

(一)在AndroidMainifest設置LaunchMode

<activity 
    android:name=".MainActivity"
    android:launchMode="singleTask">
</activity>
複製代碼

(二)經過Intent設置標誌位Intent Flag

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()方法或者自行結束而後從新建立本身。

  1. 若是該Activity在AndroidMainifest.xml裏將啓動模式設置成默認standard模式

  1. 若是該Activity在AndroidMainifest.xml裏將啓動模式設置成默認singleTop模式

  1. 若是該Activity在AndroidMainifest.xml裏將啓動模式設置成默認singleTask模式

(三)兩者的區別

  1. 優先級不一樣:Intent設置方式的優先級 > Manifest設置方式,即之前者爲準

  2. 限定範圍不一樣Manifest設置方式沒法設定FLAG_ACTIVITY_CLEAR_TOP;Intent設置方式沒法設置單例模式(SingleInstance)

4、總結

本文介紹了Activity的四種啓動模式(standard、singleTop、singleTask、singleNewInstance)和設置啓動模式的方法(launchMode、Intent_Flag)

相關文章
相關標籤/搜索