AIDL 在 AMS 中的使用

前面跟著書(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ù)吧。

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

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

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