:)

本文主要是介紹了activity的啟動(dòng)流程,前提是需要了解binder機(jī)制(不了解就還是不要往下看了)
流程大概(大概了解就行,后面會(huì)詳細(xì)講解)
- 當(dāng)我們調(diào)用startActivity (包括activtiy的和context的startActivity),最后都會(huì)調(diào)用到一個(gè)叫做Instrumentation對象的execStartActivity的方法
- 而execStartActivity方法最后調(diào)用的是ActivityManagerNative對象的startActivity(ActivityManagerNative其實(shí)就是一個(gè)binder對象,這個(gè)對象就是ActivityManagerService在用戶進(jìn)程的代理)
- 所以startActivity最后調(diào)用了ActivityManagerService的代理對象的startActivity方法,實(shí)際上就是通過代理調(diào)用了ActivityManagerService的startActivity方法(注意:到這里已經(jīng)切換到系統(tǒng)進(jìn)程了,ActivityManagerService實(shí)際上是在系統(tǒng)進(jìn)程里面)
- ActivityManagerService的startActivity方法經(jīng)過了一系列的校驗(yàn)(各種校驗(yàn)),之后調(diào)用了一個(gè)IApplicationThread(接口)的實(shí)例(ApplicationThreadNative)對象的scheduleLaunchActivity方法
- ApplicationThreadNative這個(gè)對象其實(shí)是用戶進(jìn)程在系統(tǒng)進(jìn)程里面的一個(gè)binder代理對象,用來在系統(tǒng)進(jìn)程里面返回結(jié)果給用戶進(jìn)程
- 當(dāng)調(diào)用scheduleLaunchActivity后用戶進(jìn)程就會(huì)根據(jù)各種信息將activity創(chuàng)建出來(注意:這個(gè)時(shí)候已經(jīng)是用戶進(jìn)程了)
用戶進(jìn)程首先調(diào)用了ActivityManagerService的一個(gè)binder代理,通知ActivityManagerService創(chuàng)建Activtiy。最后ActivityManagerService會(huì)調(diào)用一個(gè)通知用戶進(jìn)程的binder代理(ApplicationThreadNative),也就是系統(tǒng)進(jìn)程和用戶進(jìn)程之間的通訊是使用的兩個(gè)binder
大概流程圖

啟動(dòng)一個(gè)activity其實(shí)是分為兩種情況的,一種是Context(ContextImpl)的startActivity方法,一種是Activity的startActivity方法,這兩種方法稍有區(qū)別。
-
這兩種方法的主要一個(gè)區(qū)別就是context啟動(dòng)的activity是沒有任務(wù)棧的,可以看到如果intent沒有NEW_TASK的話會(huì)直接拋一個(gè)異常
Context的startActivity -
這兩種方法最后都是調(diào)用到了Instrumentation的execStartActivity方法,而這個(gè)Instrumentation就是用來管理activity生命周期的對象,這里面可以看到各種關(guān)于生命周期的方法。
Instrumentation里面的方法
不管是通過context還是activity調(diào)用startActivity最后都會(huì)調(diào)用到Instrumentation的execStartActivity
通知ActivityManagerService
-
這里的ActivityManagerNative.getDefault返回的就是一個(gè)binder代理(IActivityManager),調(diào)用這個(gè)之后就到達(dá)了系統(tǒng)進(jìn)程了,也就是調(diào)用到了ActivityManagerService的startActivity方法
通知用戶進(jìn)程可以創(chuàng)建activity了
-
通知的方式也是使用的是binder通信,使用的接口是IApplicationThread
IApplicationThread方法
用戶進(jìn)程接收到消息
- 用戶接收消息是在ActivityThread的內(nèi)部類ApplicationThread,里面的處理流程比較簡單,就是接收到一個(gè)消息的時(shí)候就用handler發(fā)送一個(gè)消息出去,然后handler處理消息的時(shí)候就是通過Instrumentation來處理的,包括各種生命周期的調(diào)用,以及activity的創(chuàng)建

這里就看一個(gè)創(chuàng)建的源碼吧
- 通過binder調(diào)用IApplicationThread的啟動(dòng)方法

-
sendMessage這個(gè)方法其實(shí)就是ActivityThread里面H的一個(gè)消息,在handlerMessage里面最后調(diào)用到了mInstrumentation.newActivity
總結(jié)
activity的創(chuàng)建過程簡單的說就是,用戶進(jìn)程發(fā)送一個(gè)請求到ActivityManagerService,ActivityManagerService接收到請求之后通過一系列的驗(yàn)證,驗(yàn)證通過之后又發(fā)送一個(gè)消息到用戶進(jìn)程,這個(gè)時(shí)候用戶進(jìn)程就開始了創(chuàng)建過程。其實(shí)不止創(chuàng)建是這樣的,activity的生命周期都是這樣的調(diào)用的
有好多細(xì)節(jié)沒講的不清楚,有興趣的最好是自己去看看吧~ 別人寫的永遠(yuǎn)是別人的 have a good day~




