android初級開發(fā)筆記-- activity啟動模式的學(xué)習(xí)(1)

第一次學(xué)習(xí)Android中一個很重要的概念,啟動模式。文章記錄的也只是一些入門知識,隨著學(xué)習(xí)的深入還會有activity啟動模式的學(xué)習(xí)(2)和(3)。
下面分三個小點說一下對啟動模式的理解區(qū)別以及如何設(shè)置。

預(yù)備知識

(1)activity是以任務(wù)棧的方式進行管理的,棧是一種先進后出的數(shù)據(jù)結(jié)構(gòu),棧中的activity只能通過出棧和壓棧的方式改變順序。
(2)啟動一個application的時候,系統(tǒng)會默認(rèn)創(chuàng)建一個任務(wù)棧,默認(rèn)啟動的activity都在同一個任務(wù)棧中。當(dāng)啟動另一個應(yīng)用,之前那個任務(wù)棧就會被移到后臺,成為后臺任務(wù)棧,而剛啟動的那個任務(wù)棧就被調(diào)到前臺,成為前臺任務(wù)棧。在用戶面前顯示的始終是前臺任務(wù)棧中的棧頂activity。

對四種啟動模式的理解

Android里面說的啟動模式其實就是activity的啟動方式。
有下面四種

  • standard(默認(rèn))
  • singleTop(棧頂復(fù)用)
  • singleTask(棧內(nèi)復(fù)用)
  • singleInstance(單例)

standard--系統(tǒng)默認(rèn)的activity啟動模式,不管此時任務(wù)棧中的情況如何,每次啟動一個activity,系統(tǒng)都會創(chuàng)建它的實例,并將其置于棧頂。

singleTop--另外一種常用的啟動模式,當(dāng)啟動一個activity時,系統(tǒng)會檢查一下當(dāng)前任務(wù)棧中是否已經(jīng)存在該activity實例,如果已經(jīng)存在,就通過onNewIntent獲得該實例把它置于棧頂。如果沒有。那么創(chuàng)建該activity實例后將其置于棧頂。

singleTask-- 當(dāng)以這種模式啟動activity的時候,需要指定其任務(wù)棧。
activityA啟動activityB的時候,會先在系統(tǒng)尋找是否存在該棧。

  • 不存在,創(chuàng)建棧并創(chuàng)建activity實例置于棧頂。
  • 存在,則在棧中尋找是否有B的實例,若有,則就通過onNewIntent獲得該實例至于棧頂。無則創(chuàng)建該activity實例后將其置于棧頂。

singleInstance--看到名字就會想到單例模式是吧~是的,確實也是這樣的思想。為了充分利用activity實例達到極致,設(shè)置這個啟動模式后,activityA啟動activityB,會專門為activityB創(chuàng)建一個任務(wù)棧,并且創(chuàng)建activityB實例至于棧頂。該activity實例便可被系統(tǒng)內(nèi)的應(yīng)用共享。

總結(jié)

對于時不時想把某個activity展示在用戶面前這件事,使用
默認(rèn):不管在不在棧頂,都創(chuàng)建(該棧中可能有多個實例)->棧頂復(fù)用:若在棧頂,則復(fù)用(該棧中可能有多個實例,但相對默認(rèn)模式,少了點)->棧內(nèi)復(fù)用:瞅瞅這個棧中有沒有,有就用,沒有就造一個(該棧中只有一個實例)->單例:直接自成一派,創(chuàng)個棧,只有這個activity一個實例并且在棧頂,不管哪個應(yīng)用程序都能用(該應(yīng)用程序上下文中只有一個實例)。
弄明白了這幾種啟動模式后,就需要根據(jù)實際情況決定使用哪種啟動模式。

具體使用場景

由于本人目前對啟動模式的使用比較少,后續(xù)有更多再補充。

  • 場景:使通知欄彈出Notification,點擊Notification跳轉(zhuǎn)到指定的Activity。
    假設(shè)現(xiàn)在處于棧頂展示在用戶面前的就是這個activity。如果是默認(rèn)模式,則會再次打開當(dāng)前的Activity。這樣展示在用戶面前的效果就會很奇怪。(看起來是閃了一下)
    如果使用的啟動模式是singleTop,就會避免這種現(xiàn)象的出現(xiàn)。

  • 場景:假設(shè)我們的程序中有一個Activity是允許其他程序調(diào)用的,我們想讓其他程序共享這個Activity的實例。如果使用的啟動模式是singleInstance,就可以解決這個問題。

如何設(shè)置activity的啟動模式

一般有兩種方式設(shè)置。

  • 在manifast文件中通過activity的launchMode進行設(shè)置。
  • 通過對啟動該activity的intent設(shè)置標(biāo)志位實現(xiàn)。

疑惑及解答

1.如何設(shè)置不同的任務(wù)棧?
3.當(dāng)activityA以標(biāo)準(zhǔn)模式啟動B的時候,B的實例被創(chuàng)建且處于activityA任務(wù)棧的頂端,那么這個時候B啟動了A(standard)呢?
4.這兩種設(shè)置方式有什么區(qū)別呢?常用的標(biāo)志位有好幾個,組合起來使用又有什么不同的效果呢?

這些個答案等我下一篇文章再繼續(xù)介紹哈~敬請關(guān)注android初級開發(fā)筆記-- activity啟動模式的學(xué)習(xí)(2)~

作者介紹

  • 楊曉華:廣州蘆葦科技 APP 團隊 Android 實習(xí)生

內(nèi)推信息

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容