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

吉祥發表於2019-03-22

轉載請註明出處:www.jianshu.com/p/1eb73ca03…

前言

部分內容參考Google爸爸的資料: developer.android.google.cn/guide/compo… 最近由於部門的發展需要,加上就樓主一個一線開發人員,於是乎。慘被HR當做苦力去做技術面試官。在對很多的6,7年經驗的大佬,當然還有一個讓樓主全程瑟瑟發抖的25年開發經驗的中興的元老級別大神(三年工作經驗的樓主快跪了,全程在記筆記中)。在其中樓主發現,一些一兩年經驗的開發人員對於基礎的Android知識不是很瞭解,所以打算整理一下,面試中一些技術點和麵試者對於一些問題自己新穎的看法,希望可以讓大家能夠升職加薪,走上人生巔峰。。。。

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

Android 群英傳

Android開發藝術探索

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

Activity啟動模式

四種啟動模式

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

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

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

靜態配置

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

配置launchMode
就可使用啟動模式。

動態配置

在Intent中新增FLAG也可以動態配置Activity的lauchMode模式:

  • Intent.FLAG_ACTIVITY_NEW_INTENT 類似於standard,具體參考後面講解

  • FLAG_ACTIVITY_SINGLETOP 類似於singleTop,具體參考後面講解

  • FLAG_ACTIVITY_CLEAR_TOP 類似於singleTask,具體參考後面講解

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

資料結構講解

一個正常的Android APP通常由非常多的Activity組成,並且各個Activity之間通過Intent進行連線。然而,研究過Android系統原始碼的小夥伴都會發現,Android系統,是通過棧的結構來儲存整個APP的Activity。合理的使用任務棧可以節約記憶體,為APP提供更好的效能效果。

棧結構

這裡感謝大學老師的講解了,其實棧最形象的就是桶,放進去Activity就相當於往這個桶裡放跟桶底一樣大的東西。先放進去的,需要把頂部的拿出來才可以被取出來。其結構可以一句話概括---- “先進後出,後進先出”。實在對資料結構有興趣的小夥伴也可以去百度或者找點資料看看。這裡只講一下概念,幫助對主題的理解。

棧結構

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

standard

系統預設的啟動模式,當不配置launchMode的時候,預設採用這種方式啟動。這種啟動模式每次都會建立新的例項,每次點選standard模式建立Activity後,都會建立新的Activity覆蓋在原有Activity上,其結構如圖

standard啟動模式

singleTop

如果啟動Activity為singleTop模式,那麼在啟動時,系統會判斷當前的棧頂是不是這個Activity,若不是則新建一個Activity,否則就啟動這個Activity。這個啟動模式多用於推送中,比如QQ資訊接收到100條,不可能一下建立100個Activity,singleTop可以極大避免這種問題。這種啟動模式的結構如圖:

singleTop啟動模式
這裡需要注意:雖然這種啟動模式不會建立新的例項,但是系統會在啟動Activity時呼叫該Activity中onNewIntent()方法。舉個例子,假如當前的任務棧中有A,B,C三個Activity,並且C的啟動模式是singleTop,那麼再次啟動C的時候,系統不會建立新的C例項,而是會呼叫C的onNewIntent()方法。當前的任務棧中依然是ABC三個Activity。

singleTask

singleTask模式與singleTop模式大相似,只不過singleTop是檢測棧頂是否有需要啟動的Activity,而singleTask是去檢測整個棧中是否有需要啟動的Activity。若是存在,則將該Activity置頂,並將其頂部所有的Activity全部清除。不過該業務邏輯僅僅在APP內部生效,當外部APP使用Intent隱式呼叫該Activity,它會另外建立一個新的任務棧。對於原理可以檢視官網提供的原理圖,如下:

Google singleTask啟動模式原理

可以發現,使用singleTask建立的Activity並不是在新的任務棧裡被開啟,而是將已經開啟的Activity切換到前臺,這種啟動模式可以用來退出APP: 將MainActivity設定為singleTask,然後在要退出的Activity呼叫intent到MainActivity,從而可以將MainActivity之上所有的Activity都清除,然後重寫MainActivity的onNewIntent()方法,加上一句finish(),最後將MainActivity清除掉。

singleInstance

singleInstance使用場景最少,它的工作原理與瀏覽器的工作原理相同,在於在另一個任務棧中建立對應的Activity。這裡如果A應用中Activity1為singleInstance,當A應用建立了Activity1.其他B應用呼叫該Activity1,不需要再建立,直接共享該任務棧。

注意:singleTop和singleInstance的Activity使用startActivityForResult(),會返回Activity.RESULT_CANCEL.原因在於系統會對這兩種模式做出限制,不同的Task之間,預設是不可以傳遞資料。如果需要傳遞,可以使用EventBus和Intent來繫結資料。

接下來我們會講解Activity的生命週期,文章地址: www.jianshu.com/p/d78c53f4b… 歡迎大家點贊評論和丟雞蛋

相關文章