Activity啟動流程

原文鏈接:https://blog.csdn.net/u012267215/article/details/91406211
Activity啟動流程(從Launcher開始):

image.png

第一階段: Launcher通知AMS要啟動新的Activity(在Launcher所在的進程執(zhí)行)

Launcher.startActivitySafely //首先Launcher發(fā)起啟動Activity的請求
Activity.startActivity
Activity.startActivityForResult
Instrumentation.execStartActivity //交由Instrumentation代為發(fā)起請求
ActivityManager.getService().startActivity //通過IActivityManagerSingleton.get()得到一個AMP代理對象
ActivityManagerProxy.startActivity //通過AMP代理通知AMS啟動activity

第二階段:AMS先校驗一下Activity的正確性,如果正確的話,會暫存一下Activity的信息。然后,AMS會通知Launcher程序pause Activity(在AMS所在進程執(zhí)行)

ActivityManagerService.startActivity
ActivityManagerService.startActivityAsUser
ActivityStackSupervisor.startActivityMayWait
ActivityStackSupervisor.startActivityLocked :檢查有沒有在AndroidManifest中注冊
ActivityStackSupervisor.startActivityUncheckedLocked
ActivityStack.startActivityLocked :判斷是否需要創(chuàng)建一個新的任務(wù)來啟動Activity。
ActivityStack.resumeTopActivityLocked :獲取棧頂?shù)腶ctivity,并通知Launcher應(yīng)該pause掉這個Activity以便啟動新的activity。
ActivityStack.startPausingLocked
ApplicationThreadProxy.schedulePauseActivity

第三階段: pause Launcher的Activity,并通知AMS已經(jīng)paused(在Launcher所在進程執(zhí)行)

ApplicationThread.schedulePauseActivity
ActivityThread.queueOrSendMessage
H.handleMessage
ActivityThread.handlePauseActivity
ActivityManagerProxy.activityPaused

第四階段:檢查activity所在進程是否存在,如果存在,就直接通知這個進程,在該進程中啟動Activity;不存在的話,會調(diào)用Process.start創(chuàng)建一個新進程(執(zhí)行在AMS進程,內(nèi)部通過socket和Zygote通信,fork一個新進程)

ActivityManagerService.activityPaused
ActivityStack.activityPaused
ActivityStack.completePauseLocked
ActivityStack.resumeTopActivityLocked
ActivityStack.startSpecificActivityLocked
ActivityManagerService.startProcessLocked
Process.start //在這里創(chuàng)建了新進程,新的進程會導(dǎo)入ActivityThread類,并執(zhí)行它的main函數(shù)

第五階段: 創(chuàng)建ActivityThread實例,執(zhí)行一些初始化操作,之后進入Loop循環(huán)。(執(zhí)行在新創(chuàng)建的app進程)

ActivityThread.main
ActivityThread.attach(false) //聲明不是系統(tǒng)進程
ActivityManagerProxy.attachApplication//綁定ApplicationThread,在ActivityThread被創(chuàng)建時初始化

第六階段:處理新的應(yīng)用進程發(fā)出的創(chuàng)建進程完成的通信請求,并通知新應(yīng)用程序綁定Application。如果Application不存在,會調(diào)用LoadedApk.makeApplication創(chuàng)建一個新的Application對象。并且通知進程啟動目標(biāo)Activity組件(執(zhí)行在AMS進程)
ActivityThread.bindApplication
ActivityManagerService.attachApplication //AMS綁定本地ApplicationThread對象,后續(xù)通過ApplicationThreadProxy來通信。
ActivityManagerService.attachApplicationLocked
ActivityStack.realStartActivityLocked //真正要啟動Activity了!
ApplicationThreadProxy.scheduleLaunchActivity //AMS通過ATP通知app進程啟動Activity

第七階段: 加載MainActivity類,調(diào)用onCreate聲明周期方法(執(zhí)行在新啟動的app進程)
ApplicationThread.scheduleLaunchActivity //ApplicationThread發(fā)消息給AT
ActivityThread.queueOrSendMessage
H.handleMessage //AT的Handler來處理接收到的LAUNCH_ACTIVITY的消息
ActivityThread.handleLaunchActivity
ActivityThread.performLaunchActivity
Instrumentation.newActivity //調(diào)用Instrumentation類來新建一個Activity對象
Instrumentation.callActivityOnCreate
MainActivity.onCreate
ActivityThread.handleResumeActivity
AMP.activityResumed
AMS.activityResumed(AMS進程)

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

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

  • 整個 startActivity 的流程分為3大部分,也涉及3個進程之間的交互: ActivityA --> Ac...
    倉頡空閱讀 1,385評論 0 0
  • Zygote是什么?有什么作用? Android系統(tǒng)底層基于Linux Kernel, 當(dāng)Kernel啟動過程會創(chuàng)...
    Mr槑閱讀 2,904評論 4 18
  • 引言 Activity啟動流程很多文章都已經(jīng)說過了,這里說一下自己的理解。Activity啟動流程分兩種: 一種是...
    小彤花園閱讀 4,524評論 8 36
  • 前言 Activity作為Android四大組件之一,他的啟動絕對沒有那么簡單。這里涉及到了系統(tǒng)服務(wù)進程,啟動過程...
    NeWolf閱讀 662評論 0 0
  • 以在桌面點擊一個App圖標(biāo)冷啟動為例,Activity的啟動大致可以總結(jié)為如下流程: 一個應(yīng)用對應(yīng)一個進程或多個進...
    Luckflower閱讀 652評論 0 0

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