【最新Android高級面試知識點乾貨分享(三)】
轉載請說明出處!
前面用了三篇來整理分享了我的java筆記。
接下來從第四篇開始,我將正式開啓我的Android面試筆記分享。
《Android篇》
一、Activity啓動流程
這是我自己繪製的時序圖,從Launcher開始。可能會存在不準確或看不懂的地方;
因此,也建議讀者自己根據源碼畫一下圖,加深理解記憶。
二、Activity任務棧及啓動模式
這個點也是Android面試中經常會問的點。我們會用,但保不齊在沒做準備
的情況下面試,出現空白卡殼的情況。
$2.1、 Activity Stack/ Task
從Launcher打開的app都會自動加上FLAG_ACTIVITY_NEW_TASK, 因此可知每個app默認啓動在不同的Task裏,而Task是在ActivityStack裏面創建,ActivityStack棧用於存儲Activity,而Task則用於管理Activity.
$2.2、 啓動模式
- standard:默認標準模式(每次新開都會創建一個activity實例)
- singleTop:棧頂複用
- singleTask:棧內複用
- singleInstance:單例(一個activity佔用一個task)
$2.3、taskAffiny的原理
由於啓動App時,每個Activity會默認New_Task,此屬性在於將當前Activity關聯到指定的task下。但此屬性要想生效,它必須滿足以下條件:
- 1,當前Activity的啓動模式必須爲singleTask或singleInstance
- 2,當前Activity的allowTaskReparenting得設置爲true,即允許當前Activity從啓動的Task轉移至用taskAffiny指定的Task.
$2.4、onNewIntent()執行過程
-
1,launchMode爲:singleTop/singleTask纔有效
-
2,當Activity處於onPause時,onPause–>onNewIntent–>onResume()
-
3,當Activity處於onStop時,onStop–>onNewIntent–>onRestart()—>onStart()—>onResume()
備註:在onNewIntent()方法中,記得調用setIntent()將新intent傳過去,以免調用getIntent()時獲取到的intent爲舊的Intent.
$2.5、按Home鍵退至後臺時,Activity生命週期
- 1,正常打開一個Activity的生命週期:onCreate()—>onStart()—onResume()
- 2,按Home鍵退至桌面時,棧頂Activity的生命週期爲:onPause()—>onSaveInstanceState()—>onStop()
- 3,A界面跳B界面:
A#onPause()---->B#onCreate()—B#onStart()—B#onResume()—A#onSaveInstanceState()----A#onStop() - 4,按返回鍵退出B界面,回到A界面:
B#onPause()----A#onRestart()—A#onStart()—A#onResume()----B#onStop()—B#onDestroy()
注:onSaveInstanceState()只在以下幾種情況下才會被調用:
a)、按Home鍵退出;
b)、從A跳至B界面時;
c)、按下電源鍵;
d)、屏幕切換
且onSaveInstanceState()與onPause()並沒有固定的先後順序,但一定是在onStop()前。
onRestoreInstanceState():只有當Activity是被系統回收後,再新建重新打開時,纔會被調用。如:
$2.6、 屏幕切換,Activity所執行的生命週期
當手機屏幕切換屬於系統配置變化,因此它的Activity會重建,主要由android:configChanges=""來配置。
當未配置時:
-
1,從豎屏–》橫屏:onSaveInstanceState()—>onPause()---->onStop()—>onDestroy()—>onCreate()—>onStart()—>onRestoreInstaceState()—>onResume()
-
2,從橫屏—>豎屏:上面會執行2次
【但實際寫Demo打印日誌時,在AndroidManifest.xml中未設置configChanges的情況下,依然只會執行一次】會引起系統變化的屬性有: “mcc“ 移動國家號碼,由三位數字組成,每個國家都有自己獨立的MCC,可以識別手機用戶所屬國家。 “mnc“ 移動網號,在一個國家或者地區中,用於區分手機用戶的服務商。 “locale“ 所在地區發生變化。 “touchscreen“ 觸摸屏已經改變。(這不應該常發生。) “keyboard“ 鍵盤模式發生變化,例如:用戶接入外部鍵盤輸入。 “keyboardHidden“ 用戶打開手機硬件鍵盤 “navigation“ 導航型發生了變化。(這不應該常發生。) “orientation“ 設備旋轉,橫向顯示和豎向顯示模式切換。 “fontScale“ 全局字體大小縮放發生改變 "screenSize" 屏幕尺寸變化
$2.7、Navigation導航組件
這是Android JetPack包中新出的組件,方便管理頁面路由,一個APP可由一個Activity與多個Fragment來完成。
沒有使用過的同學,可以查閱官方文檔:https://developer.android.google.cn/jetpack/androidx/releases/navigation
下一篇將整理分享關於Service,ContentProvider,Broadcast等筆記。