Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android LaunchMode四種啟動模式詳細介紹

Android LaunchMode四種啟動模式詳細介紹

編輯:關於Android編程

Android LaunchMode詳解

越是做的時間越長,基礎知識就忘的越干淨,最近做一個項目中,發現啟動的幾個Activity居然重疊了,我ri~~,再不回憶一下就要退出Android界了。

概念解釋

Task

Task叫做任務,這個簡單,表示我們需要完成的事情,注意,這裡我們說的是任務,是個名詞,例如要發短信,那我們的任務就是發送一條短信,僅此而已,再例如教官說:”張三,你去吃屎!”,ok,那張三的任務就是吃屎。

Back Stack

我們常叫做回退棧,或者是任務棧,這個是什麼意思呢?上面我們說過,需要完成任務,那我們就需要使用一系列的Activity來完成,例如發短信,則完成該任務需要如下步驟:

  1. 打開短信主頁面MainActivity
  2. 點擊添加短信按鈕,打開NewSMSActivity
  3. 在NewSMSActivity中編寫短信並發送

以上的任務中涉及到兩個Activity,那這兩個Activity就存放在這個Back Stack中,又因為Back Stack是棧類型的數據結構,所以上面的步驟在這個Back Stack中的活動順序如下:

  1. MainActivity先壓棧
  2. 點擊添加按鈕,NewSMSActivity壓棧,
  3. 短信發送完成,點擊返回按鈕,NewSMSActivity彈棧,回到MainActivity
  4. 在MainActivity點擊返回按鈕,MainActivity彈棧,此時該Back Stack為空,就返回到Launcher了

所以我們明白了,這個回退棧其實就是一個存儲Activity實例的容器,執行每個Task時,先創建一個Back Stack,在Task執行過程中將所使用的Activity都按照FILO的順序以此壓入這個Back Stack,Task目標完成之後,按下返回按鈕時,Back Stack中的Activity按照壓棧相反地的順序以此彈棧,直到棧中沒有Activity實例時,進入Launcher。

由此,我們還可以知道,每個Task和Back Stack是一一對應的關系,一般情況下,每需要執行一個Task時,都至少需要一個Back Stack容器,並且這個容器中都至少會有一個Activity實例。

LaunchMode的作用和使用方法

一般情況,如果沒精神病,LaunchMode是用在Activity上面的,我們就談談在Activity上的LaunchMode

LaunchMode作用

顧名思義,LaunchMode就是啟動模式,啥是啟動模式?啟動模式意思是使用不同的模式啟動之後,會有不同的屬性和表現,舉個例子,鋼鐵俠使用正常模式啟動,一般可以秒殺所有小兵小將,但是如果對付發狂的綠巨人浩克,就需要啟動超強模式,穿上反浩克裝甲,要不然打不過,放到我們Actiivty這裡也是一樣,既然是配置在Activity上的,那就說明Activity有好幾種啟動模式,使用不同的啟動模式啟動的Activity有不同的屬性和表現。

那為啥需要啟動模式呢?需求!對,需求是所有東西被建立或者被制造出來的原因,因為我們對Actiivty有不同的需求,舉個老生常談的發郵件例子,郵件主頁Activity要求不論怎麼打開,打開多少次,就只能有一個主頁Activity的實例,對吧,如果有多個實例我們就很麻煩,不知道顯示哪個,也不知道要關閉哪個,那這就是個需求,對應這個需求,我們就需要對這個主頁Activity設置一種啟動模式,不論怎麼打開就只有一個實例,這樣需求就滿足啦。

LaunchMode使用方法

按照Android Developer上的說明,LaunchMode有兩個使用地方,一個是Mainfest的activity節點下,一個是在startActivity方法的Intent中設置Flag,第二種方法我們後續再討論,先說說第一種方法。

要告訴小白的是,LaunchMode要在啟動該Activity之前使用才有效,如果Activity都已經啟動了,實例都創建完了,再設置什麼模式都沒用啦。

第一種使用方式特別簡單,在Mainfest中的activity節點中添加android:launchMode即可,如下所示:

<activity
  android:name=".MainActivity"
  android:label="郵件列表"
  android:launchMode="singleTask">
</activity>

有四種launchMode可選,分別是:

  1. “standard”
  2. “singleTop”
  3. “singleTask”
  4. “singleInstance”

如果不添加launchMode也可以,默認的launchMode是”standard” 。

按照Android Developer官方上,他們按照Activity是否可以被實例化多次,把這四個模式分了兩個組, “standard” 和”singleTop” 屬於可以被實例化多次這個組,他們的實例可以屬於任何Task,並且可以位於Back Stack的任何位置,其余兩個屬於不可被實例化多次這組,他們常用於啟動一個Task,所以一個Task只有一個這種實例,並且這個還往往位於Back Stack的最開始。這種分組可以幫助我們初步理解每種啟動模式的區別。

standard

從現在開始好好講解這四種啟動模式了,首先看看”standard”,有時稱為標准模式。

前面我們說過,Activity默認就是這種模式的,所以你的Activity設置和不設置這個沒什麼區別,那這種模式的表現是什麼樣子的呢?

假設我們有一個”standard”模式的Activity,頁面上有個按鈕,點擊這個按鈕就會啟動這個Activity自身,由於設置的是”standard”模式,每次啟動這個Activity,就會創建這個Activity的新的實例,並依次放入Back Stack,點擊一百次就會創建一百個這個Activity的實例。

“standard”是最簡單的模式,也符合我們正常的思維邏輯,所以最好理解,我用簡陋的畫圖工具畫了個圖,湊合著看吧:

standard模式

singleTop

這種啟動模式和標准模式區別不大,只有一點點不同。

我們已經知道,每個Activity的實例在Back Stack中存儲,既然是個Stack數據結構,那麼第一個壓棧的實例我們叫做棧底實例,因為它將被後進來的實例壓在最下面,最後被壓入的實例,稱作棧頂實例,因為它剛被壓人棧中,暫時還沒有其他實例在它之上,如果棧中只有一個實例,那這個實例既是棧底實例,也是棧頂實例。

明白了棧底和棧頂的概念,”singleTop” 就好理解了,當我們啟動”singleTop” 模式的Activity時,系統會檢查當前的Back Stack的棧頂實例是不是這個”singleTop” 模式Activity的實例,如果是的話,就不創建新的實例了,直接復用這個已經存在的棧頂實例。還拿我們上一個場景為例,如果這個Activity是”singleTop” 模式的,不論你怎麼點按鈕,Back Stack只會有一個實例,因為棧頂已經存在一個這樣的實例,所以不會創建新的了。

如果上個例子不夠明確,我們可以舉個比較明顯的例子,有兩個Activity:ActivityA是標准模式,AvtivityB是”singleTop” 模式,完成一個Task,需要經過以下步驟:

  1. 啟動ActivityA,在ActivityA中點擊按鈕啟動ActivityB,
  2. 在ActiivtyB中點擊按鈕,再次啟動ActivityB

根據之前的描述,當ActivityB的實例第一次被創建時,是位於棧頂的,第二次嘗試創建ActivityB的實例之前,由於是”singleTop” 模式,並且棧頂已經有它的實例,就不會再創建新的,這個Task完成之後,Back Stack中只有一個ActivityA的實例和一個ActivityB的實例,簡圖如下:

"singleTop" 模式

singleTask

接下來是”singleTask” 模式,還記得文章開頭說的兩個分組和區別嗎?如果你現在還記得,那你就理解了一大半了。

之前說過,”singleTask” 的Activity在一個Back Stack只會創建一個,這是和前兩個模式最大的不同,”singleTask” 和”singleTop”不同之處在於,創建實例時不僅僅只檢查棧頂是否已經有實例,還會檢查整個Back Stack,只要Back Stack已經存在實例,不論是位於棧頂,棧底還是哪裡,都不會創建新的實例。

“singleTask” 模式不僅不會創建新的實例,還會將從已經創建實例開始到棧頂的所有實例全部清除,並將已經創建的實例放到棧頂,因為只有這樣做才會讓這個實例可以顯示到窗口上。

還是繼續上面的例子,ActivityC的啟動模式為”singleTask” ,我們在Back Stack中原來的ActivityA和ActivityB實例之間插入一個ActivityC的實例,形成這樣的Back Stack結構之後,如果再次嘗試啟動ActivityC時,由於ActivityC的實例已經存在,所以復用已經存在的實例,並且清除實例到棧頂的所有實例,所以ActivityB的實例被清除了,此時Back Stack中就只有ActivtyA和ActivtyC的實例。

"singleTask" 模式

singleInstance

“singleInstance”是最後一個啟動模式,則是和其他三個模式都不同的。

我們之前談論的啟動模式,基本都是在一個Back Stack范圍內談論是否需要重新創建的問題,在這裡,我們把范圍擴大一下,討論在多個Back Stack之間重新創建的問題,設置了”singleInstance”模式的Activty,在啟動的時候,會脫離於當前Task的Back Stack,在一個新的Back Stack中創建實例。

還是我們之前的例子,現在把ActivtyA,ActivityB和ActivtyC的實例依次放入Back Stack中,並將這個Back Stack編為1號,然後編寫一個ActivityD並將其設置為”singleInstance”模式,此時,如果我們在ActivityC中啟動ActivityD,那麼ActiviyD的實例將不會位於1號Back Stack中,它將會在一個新的Back Stack中創建一個新的ActivityD實例,簡圖如下:

"singleInstance"模式

使用場景

不同的啟動模式,適用與應用中的不同應用場景。

standard

標准模式適用於大多數場景,因為在應用中,我們基本上可以允許用戶同時進行多個任務,每個任務操作不同的數據,這樣允許創建一個Activty的多個實例,例如新建郵件Activity,如果當前正在新建一個給張三的郵件,此時同時需要創建一個給李四的郵件,此時Activty就要使用標准模式,這樣允許創建多個不同的實例,允許創建多封郵件。

singleTop

singleTop模式,由於其特點是檢查棧頂實例,可以用這個特性,防止短時間創建多個實例,例如有個按鈕,點擊之後打開一個播放視頻的Activty,如果用戶短時間重復點擊,不是singleTop模式的話,就會短時間在Back Stack中出現多個實例,而且每個實例的播放進度不一致,如果是singleTop模式的話,不論打開多少次都沒有影響。

singleTask

這個模式,常用於那些有一定任務,且任務已經進行了一部分,但是忽然又去做別的事情了,等會兒回來還要繼續任務的場景,還是播放那個視頻的例子,如果正在播放的時候需要去打開新Activty搜索相關視頻,搜索完畢又要回到播放頁面,那這個頁面就比較適合使用singleTask模式

singleInstance

這種模式較少使用,如果一定要在你的應用中使用這種啟動模式,請提前考慮好是否有這個必要,另外,在做一些特殊場景下的應用,比如Launcher的主屏時,可能會使用得到。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved