觸發(fā)啟動(dòng)Activity的2種方式:Launcher啟動(dòng)和Activity啟動(dòng)
啟動(dòng)Activty的2種方式:顯式和隱式
在這個(gè)圖中幼东,ActivityManagerService和ActivityStack位于同一個(gè)進(jìn)程中臂容,而ApplicationThread和ActivityThread位于另一個(gè)進(jìn)程中。其中简逮,ActivityManagerService是負(fù)責(zé)管理Activity的生命周期的球散,ActivityManagerService還借助ActivityStack是來把所有的Activity按照后進(jìn)先出的順序放在一個(gè)堆棧中;對(duì)于每一個(gè)應(yīng)用程序來說散庶,都有一個(gè)ActivityThread來表示應(yīng)用程序的主進(jìn)程蕉堰,而每一個(gè)ActivityThread都包含有一個(gè)ApplicationThread實(shí)例凌净,它是一個(gè)Binder對(duì)象,負(fù)責(zé)和其它進(jìn)程進(jìn)行通信嘁灯。
啟動(dòng)流程:
1.通過Binder進(jìn)程進(jìn)入ActivityManagerService進(jìn)程泻蚊,調(diào)用ActivityManagerService.startActivity接口
通過mMainThread.getApplicationThread獲得它里面的ApplicationThread成員變量,它是一個(gè)Binder對(duì)象
mMainThread代表的是Launcher應(yīng)用程序運(yùn)行的進(jìn)程
2.ActivityManagerService調(diào)用ActivityStack.startActivityMayWait來做準(zhǔn)備要啟動(dòng)的Activity的相關(guān)信息丑婿;
3. ActivityStack通知ApplicationThread要進(jìn)行Activity啟動(dòng)調(diào)度了性雄,這里的ApplicationThread代表的是調(diào)用ActivityManagerService.startActivity接口的進(jìn)程,對(duì)于通過點(diǎn)擊應(yīng)用程序圖標(biāo)的情景來說羹奉,這個(gè)進(jìn)程就是Launcher了秒旋,而對(duì)于通過在Activity內(nèi)部調(diào)用startActivity的情景來說,這個(gè)進(jìn)程就是這個(gè)Activity所在的進(jìn)程了
4.?ApplicationThread不執(zhí)行真正的啟動(dòng)操作诀拭,它通過調(diào)用ActivityManagerService.activityPaused接口進(jìn)入到ActivityManagerService進(jìn)程中迁筛,看看是否需要?jiǎng)?chuàng)建新的進(jìn)程來啟動(dòng)Activity;
5. 對(duì)于通過點(diǎn)擊應(yīng)用程序圖標(biāo)來啟動(dòng)Activity的情景來說耕挨,ActivityManagerService在這一步中细卧,會(huì)調(diào)用startProcessLocked來創(chuàng)建一個(gè)新的進(jìn)程,而對(duì)于通過在Activity內(nèi)部調(diào)用startActivity來啟動(dòng)新的Activity來說筒占,這一步是不需要執(zhí)行的贪庙,因?yàn)樾碌腁ctivity就在原來的Activity所在的進(jìn)程中進(jìn)行啟動(dòng)
6. ActivityManagerServic調(diào)用ApplicationThread.scheduleLaunchActivity接口,通知相應(yīng)的進(jìn)程執(zhí)行啟動(dòng)Activity的操作翰苫;
7. ApplicationThread把這個(gè)啟動(dòng)Activity的操作轉(zhuǎn)發(fā)給ActivityThread止邮,ActivityThread通過ClassLoader導(dǎo)入相應(yīng)的Activity類,然后把它啟動(dòng)起來