擼擼Android的羊毛(一)----Activity啟動模式

轉(zhuǎn)載請注明出處:http://www.itdecent.cn/p/1eb73ca03fbe

前言

部分內(nèi)容參考Google爸爸的資料:
https://developer.android.google.cn/guide/components/tasks-and-back-stack?hl=zh-cn
最近由于部門的發(fā)展需要,加上就樓主一個一線開發(fā)人員,于是乎。慘被HR當(dāng)做苦力去做技術(shù)面試官。在對很多的6,7年經(jīng)驗的大佬,當(dāng)然還有一個讓樓主全程瑟瑟發(fā)抖的25年開發(fā)經(jīng)驗的中興的元老級別大神(三年工作經(jīng)驗的樓主快跪了,全程在記筆記中)。在其中樓主發(fā)現(xiàn),一些一兩年經(jīng)驗的開發(fā)人員對于基礎(chǔ)的Android知識不是很了解,所以打算整理一下,面試中一些技術(shù)點(diǎn)和面試者對于一些問題自己新穎的看法,希望可以讓大家能夠升職加薪,走上人生巔峰。。。。

在我面試中,我問的最多就是Activity的啟動模式,也為此去查閱了很多資料,這里安利兩本書《Android 群英傳》,《Android開發(fā)藝術(shù)探索》


Android 群英傳
Android開發(fā)藝術(shù)探索

樓主是把兩本書都翻爛了,受益匪淺。

Activity啟動模式

四種啟動模式

那么開始講解Android中Acivity的四種啟動模式:

  • standard
  • singleTop
  • singleTask
  • singleInstance
    這四種啟動模式所具有的功能完全不一樣,我們將一一講解。

使用方法(靜態(tài)配置和動態(tài)配置)

靜態(tài)配置

在android 的mainifest目錄下,對Acivity的屬性中增加launchMode屬性,效果如下:
配置launchMode

就可使用啟動模式。

動態(tài)配置

在Intent中添加FLAG也可以動態(tài)配置Activity的lauchMode模式:

  • Intent.FLAG_ACTIVITY_NEW_INTENT
    類似于standard,具體參考后面講解

  • FLAG_ACTIVITY_SINGLETOP
    類似于singleTop,具體參考后面講解

  • FLAG_ACTIVITY_CLEAR_TOP
    類似于singleTask,具體參考后面講解

singleInstance就比較悲劇,沒有方法配置。。。(singleInstance已經(jīng)哭暈在廁所)

數(shù)據(jù)結(jié)構(gòu)講解

一個正常的Android APP通常由非常多的Activity組成,并且各個Activity之間通過Intent進(jìn)行連接。然而,研究過Android系統(tǒng)源碼的小伙伴都會發(fā)現(xiàn),Android系統(tǒng),是通過棧的結(jié)構(gòu)來保存整個APP的Activity。合理的使用任務(wù)??梢怨?jié)約內(nèi)存,為APP提供更好的性能效果。

棧結(jié)構(gòu)

這里感謝大學(xué)老師的講解了,其實棧最形象的就是桶,放進(jìn)去Activity就相當(dāng)于往這個桶里放跟桶底一樣大的東西。先放進(jìn)去的,需要把頂部的拿出來才可以被取出來。其結(jié)構(gòu)可以一句話概括---- “先進(jìn)后出,后進(jìn)先出”。實在對數(shù)據(jù)結(jié)構(gòu)有興趣的小伙伴也可以去百度或者找點(diǎn)資料看看。這里只講一下概念,幫助對主題的理解。


棧結(jié)構(gòu)

理解棧,我們就來一一講解這四個啟動模式

standard

系統(tǒng)默認(rèn)的啟動模式,當(dāng)不配置launchMode的時候,默認(rèn)采用這種方式啟動。這種啟動模式每次都會創(chuàng)建新的實例,每次點(diǎn)擊standard模式創(chuàng)建Activity后,都會創(chuàng)建新的Activity覆蓋在原有Activity上,其結(jié)構(gòu)如圖


standard啟動模式

singleTop

如果啟動Activity為singleTop模式,那么在啟動時,系統(tǒng)會判斷當(dāng)前的棧頂是不是這個Activity,若不是則新建一個Activity,否則就啟動這個Activity。這個啟動模式多用于推送中,比如QQ信息接收到100條,不可能一下創(chuàng)建100個Activity,singleTop可以極大避免這種問題。這種啟動模式的結(jié)構(gòu)如圖:


singleTop啟動模式

這里需要注意:雖然這種啟動模式不會創(chuàng)建新的實例,但是系統(tǒng)會在啟動Activity時調(diào)用該Activity中onNewIntent()方法。舉個例子,假如當(dāng)前的任務(wù)棧中有A,B,C三個Activity,并且C的啟動模式是singleTop,那么再次啟動C的時候,系統(tǒng)不會創(chuàng)建新的C實例,而是會調(diào)用C的onNewIntent()方法。當(dāng)前的任務(wù)棧中依然是ABC三個Activity。

singleTask

singleTask模式與singleTop模式大相似,只不過singleTop是檢測棧頂是否有需要啟動的Activity,而singleTask是去檢測整個棧中是否有需要啟動的Activity。若是存在,則將該Activity置頂,并將其頂部所有的Activity全部清除。不過該業(yè)務(wù)邏輯僅僅在APP內(nèi)部生效,當(dāng)外部APP使用Intent隱式調(diào)用該Activity,它會另外建立一個新的任務(wù)棧。對于原理可以查看官網(wǎng)提供的原理圖,如下:

Google singleTask啟動模式原理

可以發(fā)現(xiàn),使用singleTask創(chuàng)建的Activity并不是在新的任務(wù)棧里被打開,而是將已經(jīng)打開的Activity切換到前臺,這種啟動模式可以用來退出APP:
將MainActivity設(shè)置為singleTask,然后在要退出的Activity調(diào)用intent到MainActivity,從而可以將MainActivity之上所有的Activity都清除,然后重寫MainActivity的onNewIntent()方法,加上一句finish(),最后將MainActivity清除掉。

singleInstance

singleInstance使用場景最少,它的工作原理與瀏覽器的工作原理相同,在于在另一個任務(wù)棧中創(chuàng)建對應(yīng)的Activity。這里如果A應(yīng)用中Activity1為singleInstance,當(dāng)A應(yīng)用創(chuàng)建了Activity1.其他B應(yīng)用調(diào)用該Activity1,不需要再創(chuàng)建,直接共享該任務(wù)棧。

注意:singleTop和singleInstance的Activity使用startActivityForResult(),會返回Activity.RESULT_CANCEL.原因在于系統(tǒng)會對這兩種模式做出限制,不同的Task之間,默認(rèn)是不可以傳遞數(shù)據(jù)。如果需要傳遞,可以使用EventBus和Intent來綁定數(shù)據(jù)。

接下來我們會講解Activity的生命周期,文章地址:
http://www.itdecent.cn/p/d78c53f4b1b9
歡迎大家點(diǎn)贊評論和丟雞蛋

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

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

  • 一、概述 Activity 作為與用戶交互的一個窗口,是使用非常頻繁的一個基本組件。Android系統(tǒng)是通過Act...
    三也視界閱讀 2,401評論 3 11
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,733評論 25 709
  • 刻板印象特別是對自己的負(fù)面的判斷,會讓自己落入“自我預(yù)言”的陷阱。 比如說,認(rèn)為自己在某一方面能力欠缺,或者公眾也...
    方策家族閱讀 654評論 0 0
  • 今天晚上吃完飯我和姐姐還有媽媽玩成語接龍,媽媽開出了一個花子,姐姐花好月圓,又接了一個圓木方孔,姐姐又接空前絕后,...
    李嘉寶1閱讀 255評論 0 0
  • #心靈自由寫作群#【2018.5.3】 “生命中有一種未確定、無法預(yù)測的因素,這種因素對算命先生來說是一根想要拔掉...
    Sadhya閱讀 440評論 0 1

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