Android App 的啟動過程簡析

轉(zhuǎn)至: Android App 的啟動過程簡析_callActivityOnCreate的博客-CSDN博客

首先,在APK文件安裝的時候,PackageManager會解析APK中重要的AndroidManifest.xml文件,你在AndroidManifest.xml中注冊過的所有Activity 和Service等四大組件的信息,也就會在此刻被PM獲取到并存儲起來。

當你在安裝完APK文件并打開該app的時候,這里分兩種情況。第一是你在LAUNCH中點擊app的 圖標打開,第二是在安裝完成界面直接打開,這兩種情況打開的本質(zhì)相同。

第一種情況下,在你點擊app的圖標后,LAUNCH會通過shortcutinfo中存儲的intent調(diào)用 startActivity方法來啟動這個app的默認Activity,在LAUNCH調(diào)用startActivity方法后,調(diào)用流程會轉(zhuǎn)到Instrumentation對象的execStartActivity方法里,在此處會遠程調(diào)用 AMS的startActivity方法。

在start這個Activity之前,AMS首先必須要獲得啟動的activity信息,這個信息會通過調(diào)用 startActivityMayWait方法以及傳進來的intent并結(jié)合PM 的resolveIntent方法返回,要啟動的activity信息獲取完成后,需要將這個activityinfo保存到Intent中。然后在通過AMS的startActivityLocked方法來new一個和該Activity 相匹配的ActivityRecord對象,AMS正是通過操控ActivityRecord對象(當然還包括TaskRecord以及ProcessRecord)來管理Activity的,然后AMS會進行一系列task以及 Activity是否復用的判斷,如果沒有可復用的activity, 那么需要啟動一個新的activity,如果有可復用的activity,那么activity的啟動過程至此結(jié)束,直接調(diào)用resumeTopActivityLocked方法即可。

等上述過程完成后,接著AMS 會調(diào)用startProcessLocked方法來通知Zygote孵化并啟動新進程,然后會開啟該app的主線程,此刻,調(diào)用流程進入ActivityThread類中。

ActivityThread類從main方法開始執(zhí)行,內(nèi)部調(diào)用prepareMainLooper方法創(chuàng)建消息隊列,然后new一個ActivityThread對象,在初始化方法里創(chuàng)建一個H類對象和ApplicationThread對象,ApplicationThread對象來響應AMS的遠程調(diào)用,然后ActivityThread對象會調(diào)用attach方法,內(nèi)部會遠程調(diào)用AMS的attachApplication方法,接著調(diào)用realstartActivityLocked方法來通過遠程調(diào)用通知Activity可以創(chuàng)建了,ActivityThread里面的ApplicationThread對象會響應這個通知,并調(diào)用scheduleLaunchActivity方法完成Activity調(diào)用前的信息初始化工作,然后通過H類把activityStart的通知發(fā)送到消息隊列中,主線程會異步的從消息隊列中取這個消息并調(diào)用performLaunchActivity方法來啟動activity,啟動的過程本身其實并不復雜,只是在啟動之前會進行一系列相關(guān)信息的初始化,然后會使用Classloader類加載器加載對應的activity類,然后newInstance對應activity類的實例,然后是context,title,config等信息的獲取,之后調(diào)用attach方法把之前獲取和設(shè)置的東西和當前的activity類綁定,這也就是activity類之后能運行起來要依賴的東西,綁定結(jié)束之后,activity實例調(diào)用setTheme方法給自己設(shè)置主題,然后通過調(diào)用Instrumentation對象的callActivityOnCreate方法來調(diào)起這個默認activity的onCreate方法,接下來就是onStart生命周期方法的調(diào)用(需要結(jié)合ActivityRecord中activity的狀態(tài)),這里依然會通過AMS,ActivityThread,Instrumentation三者的相互合作來完成。至此app就啟動起來了。
————————————————
版權(quán)聲明:本文為CSDN博主「callActivityOnCreate」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/callactivityoncreate/article/details/50418500

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

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

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