Android初级开发笔记-- activity启动模式的学习(1)
第一次學(xué)習(xí)Android中一個(gè)很重要的概念,啟動(dòng)模式。文章記錄的也只是一些入門知識(shí),隨著學(xué)習(xí)的深入還會(huì)有activity啟動(dòng)模式的學(xué)習(xí)(2)和(3)。 下面分三個(gè)小點(diǎn)說一下對(duì)啟動(dòng)模式的理解區(qū)別以及如何設(shè)置。
預(yù)備知識(shí)
(1)activity是以任務(wù)棧的方式進(jìn)行管理的,棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),棧中的activity只能通過出棧和壓棧的方式改變順序。 (2)啟動(dòng)一個(gè)application的時(shí)候,系統(tǒng)會(huì)默認(rèn)創(chuàng)建一個(gè)任務(wù)棧,默認(rèn)啟動(dòng)的activity都在同一個(gè)任務(wù)棧中。當(dāng)啟動(dòng)另一個(gè)應(yīng)用,之前那個(gè)任務(wù)棧就會(huì)被移到后臺(tái),成為后臺(tái)任務(wù)棧,而剛啟動(dòng)的那個(gè)任務(wù)棧就被調(diào)到前臺(tái),成為前臺(tái)任務(wù)棧。在用戶面前顯示的始終是前臺(tái)任務(wù)棧中的棧頂activity。
對(duì)四種啟動(dòng)模式的理解
Android里面說的啟動(dòng)模式其實(shí)就是activity的啟動(dòng)方式。 有下面四種
- standard(默認(rèn))
- singleTop(棧頂復(fù)用)
- singleTask(棧內(nèi)復(fù)用)
- singleInstance(單例)
standard--系統(tǒng)默認(rèn)的activity啟動(dòng)模式,不管此時(shí)任務(wù)棧中的情況如何,每次啟動(dòng)一個(gè)activity,系統(tǒng)都會(huì)創(chuàng)建它的實(shí)例,并將其置于棧頂。
singleTop--另外一種常用的啟動(dòng)模式,當(dāng)啟動(dòng)一個(gè)activity時(shí),系統(tǒng)會(huì)檢查一下當(dāng)前任務(wù)棧中是否已經(jīng)存在該activity實(shí)例,如果已經(jīng)存在,就通過onNewIntent獲得該實(shí)例把它置于棧頂。如果沒有。那么創(chuàng)建該activity實(shí)例后將其置于棧頂。
singleTask-- 當(dāng)以這種模式啟動(dòng)activity的時(shí)候,需要指定其任務(wù)棧。 activityA啟動(dòng)activityB的時(shí)候,會(huì)先在系統(tǒng)尋找是否存在該棧。
- 不存在,創(chuàng)建棧并創(chuàng)建activity實(shí)例置于棧頂。
- 存在,則在棧中尋找是否有B的實(shí)例,若有,則就通過onNewIntent獲得該實(shí)例至于棧頂。無則創(chuàng)建該activity實(shí)例后將其置于棧頂。
singleInstance--看到名字就會(huì)想到單例模式是吧~是的,確實(shí)也是這樣的思想。為了充分利用activity實(shí)例達(dá)到極致,設(shè)置這個(gè)啟動(dòng)模式后,activityA啟動(dòng)activityB,會(huì)專門為activityB創(chuàng)建一個(gè)任務(wù)棧,并且創(chuàng)建activityB實(shí)例至于棧頂。該activity實(shí)例便可被系統(tǒng)內(nèi)的應(yīng)用共享。
總結(jié)
對(duì)于時(shí)不時(shí)想把某個(gè)activity展示在用戶面前這件事,使用 默認(rèn):不管在不在棧頂,都創(chuàng)建(該棧中可能有多個(gè)實(shí)例)->棧頂復(fù)用:若在棧頂,則復(fù)用(該棧中可能有多個(gè)實(shí)例,但相對(duì)默認(rèn)模式,少了點(diǎn))->棧內(nèi)復(fù)用:瞅瞅這個(gè)棧中有沒有,有就用,沒有就造一個(gè)(該棧中只有一個(gè)實(shí)例)->單例:直接自成一派,創(chuàng)個(gè)棧,只有這個(gè)activity一個(gè)實(shí)例并且在棧頂,不管哪個(gè)應(yīng)用程序都能用(該應(yīng)用程序上下文中只有一個(gè)實(shí)例)。 弄明白了這幾種啟動(dòng)模式后,就需要根據(jù)實(shí)際情況決定使用哪種啟動(dòng)模式。
具體使用場(chǎng)景
由于本人目前對(duì)啟動(dòng)模式的使用比較少,后續(xù)有更多再補(bǔ)充。
-
場(chǎng)景:使通知欄彈出Notification,點(diǎn)擊Notification跳轉(zhuǎn)到指定的Activity。 假設(shè)現(xiàn)在處于棧頂展示在用戶面前的就是這個(gè)activity。如果是默認(rèn)模式,則會(huì)再次打開當(dāng)前的Activity。這樣展示在用戶面前的效果就會(huì)很奇怪。(看起來是閃了一下) 如果使用的啟動(dòng)模式是singleTop,就會(huì)避免這種現(xiàn)象的出現(xiàn)。
-
場(chǎng)景:假設(shè)我們的程序中有一個(gè)Activity是允許其他程序調(diào)用的,我們想讓其他程序共享這個(gè)Activity的實(shí)例。如果使用的啟動(dòng)模式是singleInstance,就可以解決這個(gè)問題。
如何設(shè)置activity的啟動(dòng)模式
一般有兩種方式設(shè)置。
- 在manifast文件中通過activity的launchMode進(jìn)行設(shè)置。
- 通過對(duì)啟動(dòng)該activity的intent設(shè)置標(biāo)志位實(shí)現(xiàn)。
疑惑及解答
1.如何設(shè)置不同的任務(wù)棧?
2.當(dāng)activityA以標(biāo)準(zhǔn)模式啟動(dòng)B的時(shí)候,B的實(shí)例被創(chuàng)建且處于activityA任務(wù)棧的頂端,那么這個(gè)時(shí)候B啟動(dòng)了A(standard)呢?
3.這兩種設(shè)置方式有什么區(qū)別呢?常用的標(biāo)志位有好幾個(gè),組合起來使用又有什么不同的效果呢?
這些個(gè)答案等我下一篇文章再繼續(xù)介紹哈~敬請(qǐng)關(guān)注Android初級(jí)開發(fā)筆記-- activity啟動(dòng)模式的學(xué)習(xí)(2)~
作者介紹
- 楊曉華:廣州蘆葦科技 APP 團(tuán)隊(duì) Android 實(shí)習(xí)生
內(nèi)推信息
- 我們正在招募小伙伴,有興趣的小伙伴可以把簡歷發(fā)到 app@talkmoney.cn,備注:來自掘金社區(qū)
- 詳情可以戳這里--> 廣州蘆葦信息科技
轉(zhuǎn)載于:https://juejin.im/post/5cf3f929f265da1b8d1605c5
總結(jié)
以上是生活随笔為你收集整理的Android初级开发笔记-- activity启动模式的学习(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于React Native和Ether
- 下一篇: android生成大分辨率图片,自动生成