国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

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

2019-12-12 04:14:57
字體:
來源:轉載
供稿:網友

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的主屏時,可能會使用得到。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 遂溪县| 扬州市| 额尔古纳市| 安宁市| 河津市| 平潭县| 来凤县| 揭东县| 黔江区| 梁山县| 蒲城县| 阳谷县| 县级市| 邵阳县| 江都市| 华安县| 宿州市| 隆化县| 桂平市| 马关县| 容城县| 深州市| 抚远县| 邵阳市| 鹿泉市| 聂拉木县| 高尔夫| 扎囊县| 南川市| 紫阳县| 兴城市| 宝山区| 皮山县| 桐城市| 萍乡市| 济源市| 克东县| 中宁县| 河西区| 独山县| 军事|