轉(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ù)探索》


樓主是把兩本書都翻爛了,受益匪淺。
Activity啟動模式
四種啟動模式
那么開始講解Android中Acivity的四種啟動模式:
- standard
- singleTop
- singleTask
- singleInstance
這四種啟動模式所具有的功能完全不一樣,我們將一一講解。
使用方法(靜態(tài)配置和動態(tài)配置)
靜態(tài)配置
在android 的mainifest目錄下,對Acivity的屬性中增加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)資料看看。這里只講一下概念,幫助對主題的理解。

理解棧,我們就來一一講解這四個啟動模式
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)如圖

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

這里需要注意:雖然這種啟動模式不會創(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)提供的原理圖,如下:

可以發(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)贊評論和丟雞蛋