AMS
AMS的功能
- ==統(tǒng)一調(diào)試應(yīng)用程序的Activity==:應(yīng)用程序要運(yùn)行Activity,首先會報(bào)告給AmS,然后由AmS決定該Activity是否啟動梳码。AMS必須知道各個應(yīng)用程序運(yùn)行的Activity。
- ==內(nèi)存管理==: Activity退出后遣钳,其所在的進(jìn)程并不會被立即殺死晌纫,從而在下次啟動的時候,提高Activity的啟動速度淤翔。這些Activity只有在內(nèi)存吃緊的時候,才會被自動殺死佩谷,這些操作由AMS管理旁壮。
- ==進(jìn)程管理==: AmS向外提供了查詢系統(tǒng)正在運(yùn)行的進(jìn)程API。
AMS創(chuàng)建過程
- AMS是在SystemServer中啟動的谐檀,==SystemServer的main方法中調(diào)用它的run方法==抡谐。
- 在run方法中(會創(chuàng)建SystemServiceManager,它會對系統(tǒng)的服務(wù)進(jìn)行創(chuàng)建 桐猬、啟動麦撵、和生命周期管理)==會調(diào)startBootstrapService()方法啟動引導(dǎo)服務(wù)==(ActivityManagerService、PowerManagerService、PackageManagerService等)
- 在startBootstrapService()方法中==調(diào)用了SystemServiceManager的startService方法免胃,方法參數(shù)是AMS的內(nèi)部類Lifecycle音五,它的構(gòu)造函數(shù)會new一個AMS的對象。==
AMS家族重要術(shù)語解釋
ActivityManagerServices羔沙,簡稱AMS躺涝,服務(wù)端對象,負(fù)責(zé)系統(tǒng)中所有Activity的生命周期撬碟。
==ActivityThread==诞挨,App的真正入口莉撇。當(dāng)開啟App之后呢蛤,調(diào)用main()開始運(yùn)行,開啟消息循環(huán)隊(duì)列棍郎,這就是傳說的UI線程或者叫主線程其障。與ActivityManagerService一起完成Activity的管理工作。
ApplicationThread涂佃,用來實(shí)現(xiàn)ActivityManagerServie與ActivityThread之間的交互励翼。在ActivityManagerSevice需要管理相關(guān)Application中的Activity的生命周期時,通過ApplicationThread的代理對象與ActivityThread通信辜荠。
ApplicationThreadProxy汽抚,是ApplicationThread在服務(wù)器端的代理,負(fù)責(zé)和客戶端的ApplicationThread通信伯病。AMS就是通過該代理與ActivityThread進(jìn)行通信的造烁。
Instrumentation,每一個應(yīng)用程序只有一個Instrumetation對象午笛,每個Activity內(nèi)都有一個對該對象的引用惭蟋,Instrumentation可以理解為應(yīng)用進(jìn)程的管家,ActivityThread要創(chuàng)建或暫停某個Activity時药磺,都需要通過Instrumentation來進(jìn)行具體的操作告组。
ActivityStack,Activity在AMS的棧管理癌佩,用來記錄經(jīng)啟動的Activity的先后關(guān)系木缝,狀態(tài)信息等。通過ActivtyStack決定是否需要啟動新的進(jìn)程围辙。
ActivityRecord氨肌,ActivityStack的管理對象,每個Acivity在AMS對應(yīng)一個ActivityRecord酌畜,來記錄Activity狀態(tài)以及其他的管理信息怎囚。其實(shí)就是服務(wù)器端的Activity對象的映像。
TaskRecord,AMS抽象出來的一個“任務(wù)”的概念恳守,是記錄ActivityRecord的棧考婴,一個“Task”包含若干個ActivityRecord。AMS用TaskRecord確保Activity啟動和退出的順序催烘。如果你清楚Activity的4種launchMode沥阱,那么對這概念應(yīng)該不陌生。
AMS相關(guān)類圖
APP啟動過程(根Activity啟動)
- 1伊群、點(diǎn)擊桌面應(yīng)用圖標(biāo)考杉,==Launcher進(jìn)程將啟動Activity(MainActivity)的請求以Binder的方式發(fā)送給了AMS==。
- 2舰始、==AMS接收到啟動請求后崇棠,交付ActivityStarter處理Intent和Flag等信息==,然后再交給ActivityStackSupervisior/ActivityStack 處理Activity進(jìn)棧相關(guān)流程丸卷。==同時以Socket方式請求Zygote進(jìn)程fork新進(jìn)程==枕稀。
- 3、==Zygote接收到新進(jìn)程創(chuàng)建請求后fork出新進(jìn)程==谜嫉。
- 4萎坷、==在新進(jìn)程里創(chuàng)建ActivityThread對象==,新創(chuàng)建的ActivityThread就是應(yīng)用的主線程沐兰,==在主線程里開啟Looper消息循環(huán)哆档,開始處理創(chuàng)建Activity==。
- 5住闯、==ActivityThread利用ClassLoader去加載Activity瓜浸、創(chuàng)建Activity實(shí)例,并回調(diào)Activity的onCreate()方法==寞秃,這樣便完成了Activity的啟動斟叼。
==整個流程主要涉及四個進(jìn)程==:
- ==調(diào)用者進(jìn)程==,如果是在桌面啟動應(yīng)用就是Launcher應(yīng)用進(jìn)程春寿。
- ActivityManagerService等所在的==System Server進(jìn)程==颅停,該進(jìn)程主要運(yùn)行著系統(tǒng)服務(wù)組件鳄袍。
- ==Zygote進(jìn)程==,該進(jìn)程主要用來fork新進(jìn)程。
- ==新啟動的應(yīng)用進(jìn)程==临燃,該進(jìn)程就是用來承載應(yīng)用運(yùn)行的進(jìn)程了要出,它也是應(yīng)用的主線程(新創(chuàng)建的進(jìn)程就是主線程)奄毡,處理組件生命周期商蕴、界面繪制等相關(guān)事情。
普通Activity啟動過程
普通Activity的啟動過程只涉及兩個進(jìn)程造壮,AMS所在進(jìn)程和應(yīng)用程序進(jìn)程渡讼。
啟動Activity B -> 當(dāng)前有正在顯示的activity嗎 -> 有就先pause() -> B的進(jìn)程存在嗎 -> 不存在則創(chuàng)建 -> B進(jìn)程啟動指定的Activity