前面跟著書(shū)本整理過(guò) AMS 相關(guān)的源碼 Android 進(jìn)階解密閱讀筆記7,不過(guò)那時(shí)對(duì) AIDL 的使用還不理解,后面我就去看了 Binder 機(jī)制還有 AIDL 相關(guān)的內(nèi)容,現(xiàn)在在回過(guò)頭來(lái)看看 AMS 具體怎么使用的。
public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, String resultWho, Intent intent, int requestCode, Bundle options, UserHandle user) {
//在 API 29 里啟動(dòng) Activity 已經(jīng)不歸 AMS 負(fù)責(zé)了,而是交給了 ATMS
int result = ActivityTaskManager.getService().startActivityAsUser(whoThread, who.getBasePackageName(), intent,intent.resolveTypeIfNeeded(who.getContentResolver()),
token, resultWho,requestCode, 0, null, options, user.getIdentifier());
}
這里我看的是 API 29 的源碼,雖然不再是 ActivityManagerService 負(fù)責(zé),但主體邏輯還是不變,只不過(guò)現(xiàn)在分工更加細(xì)致明確而已。原本是分析 AMS 的,這里就拿 ActivityTaskManagerService 來(lái)分析吧。
public static IActivityTaskManager getService() {
return IActivityTaskManagerSingleton.get();
}
private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton = new Singleton<IActivityTaskManager>() {
@Override
protected IActivityTaskManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
return IActivityTaskManager.Stub.asInterface(b);
}
}
相對(duì)于 ActivityManager,同樣衍生出一個(gè) ActivityTaskManager,并提供了 getService 方法用于獲取 IActivityTaskManager。IActivityTaskManager 一看就是個(gè)接口,從源碼上看,它是個(gè) aidl 文件。那這么一來(lái),它會(huì)生成相對(duì)應(yīng)的 IActivityTaskManager.java 文件,并在內(nèi)部還有 Stub,Proxy 這樣的內(nèi)部類。
所以在上面的 create 方法中,首先通過(guò) ServiceManager 獲取到 activity_task 服務(wù),返回的 IBinder 類型 b 其實(shí)就是在系統(tǒng)服務(wù)進(jìn)程中的 ATMS 服務(wù)的 Binder 實(shí)體,再通過(guò) IActivityTaskManager.Stub 進(jìn)行了轉(zhuǎn)化成接口引用,這樣應(yīng)用進(jìn)程就能用了。
不過(guò)使用 AIDL 是需要我們做兩個(gè)工作的,1.定義接口上面已經(jīng)提到,就是 IActivityTaskManager。2.實(shí)例化靜態(tài)內(nèi)部類 Stub。其實(shí) ActivityTaskManagerService 繼承了 IActivityTaskManager.Stub 也就是為了實(shí)現(xiàn)接口定義的方法,所以實(shí)例化對(duì)象就是系統(tǒng)服務(wù)進(jìn)程啟動(dòng)時(shí)創(chuàng)建的。
所以 ATMS 家族包括 IActivityTaskManager 接口,IActivityTaskManager.Stub 及其子類 ActivityTaskManagerService,還有我們表面上看不到的 IActivityTaskManager.Proxy。這樣就得出了和書(shū)中一樣的結(jié)論了。
雖然啟動(dòng) Activity 不再交給 AMS 了,但 AMS 在其他功能還是有用的,并且其實(shí)現(xiàn)及使用過(guò)程和 ATMS 幾乎沒(méi)有區(qū)別,我理解的 ATMS 其實(shí)像是 AMS 分出來(lái)的一部分,專門(mén)提供 Activity 相關(guān)的服務(wù)吧。