【最新Android高級面試知識點--Activity啓動流程】

【最新Android高級面試知識點乾貨分享(三)】
轉載請說明出處

前面用了三篇來整理分享了我的java筆記。
接下來從第四篇開始,我將正式開啓我的Android面試筆記分享。

《Android篇》

一、Activity啓動流程

這是我自己繪製的時序圖,從Launcher開始。可能會存在不準確或看不懂的地方;
因此,也建議讀者自己根據源碼畫一下圖,加深理解記憶。

Activity啓動流程

二、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等筆記。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章