AMS相關(guān)總結(jié)

本文用于記錄AMS的相關(guān)知識總結(jié)。

AMS(ActivityManagerService)主要負責(zé)系統(tǒng)中四大組件的啟動、切換、調(diào)度及應(yīng)用進程的管理和調(diào)度等工作。

1. Activity的啟動

在我們平常的調(diào)用中,我們在Activity中調(diào)用startActivity(Intent intent),實際調(diào)用的代碼的層次是Activity → Instrumentation → ActivityManager → IActivityManager (AMS),Instrumentation作為一個中轉(zhuǎn)站,或者是切入面,來通知AMS去實現(xiàn)對應(yīng)的功能。

① Activity

這個沒啥好說的,Activity的啟動函數(shù)。需要注意的是,實際上的啟動過程跳轉(zhuǎn)到mInstrumentation,也就是Instrumentation類中。

@Override
public void startActivity(Intent intent) {
    this.startActivity(intent, null);
}

@Override
public void startActivity(Intent intent, @Nullable Bundle options) {
    if (options != null) {
        startActivityForResult(intent, -1, options);
    } else {
        // Note we want to go through this call for compatibility with
        // applications that may have overridden the method.
        startActivityForResult(intent, -1);
    }
}

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) {
    if (mParent == null) {
        ...
        // 委托給 Instrumentation
        Instrumentation.ActivityResult ar =
            mInstrumentation.execStartActivity(
                this, mMainThread.getApplicationThread(), mToken, this,
                intent, requestCode, options);
        ....
    }
    ...
}
② Instrumentation

Instrumentation的啟動是交給ActivityManager.getService(),實際上也就是AMS了。

public ActivityResult execStartActivity(
          Context who, IBinder contextThread, IBinder token, Activity target,
          Intent intent, int requestCode, Bundle options) {
    ...
    try {
        ...
        // 找到 AMS 告知要啟動 Activity
        int result = ActivityManager.getService()
            .startActivity(whoThread, who.getBasePackageName(), intent,
                    intent.resolveTypeIfNeeded(who.getContentResolver()),
                    token, target != null ? target.mEmbeddedID : null,
                    requestCode, 0, null, options); 
        ...             
    }
    ...
}
③ ActivityManager

ActivityManager.getService() 會獲取 IActivityManager,它是一個 binder 代理對象。從代碼可以看出,當使用 ActivityManager.getService() 對象調(diào)用方法時,實際上已經(jīng)在做跨進程通信,由 binder 代理對象和 AMS 通信,通信所在的進程是 system_server。

public static IActivityManager getService() {
    return IActivityManagerSingleton.get();
}

private static final Singleton<IActivityManager> IActivityManagerSingleton =
        new Singleton<IActivityManager>() {
            @Override
            protected IActivityManager create() {
                // 通過 ServiceManager 獲取 AMS 服務(wù)
                // IActivityManager 是 binder 代理
                final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                final IActivityManager am = IActivityManager.Stub.asInterface(b);
                return am; 
            }
        };
App 的啟動過程

① 調(diào)用 startActivity() 時,實際會走到 Instrumentation,由它與 AMS 通信
Instrumentation 會找 ServiceManager 獲取 AMS(實際是獲取 binder 代理)調(diào)用 startActivity()。在 9.0 之前是獲取 AMS,9.0 之后是獲取 ATMS。

② AMS 找到 PMS 獲取啟動的 Activity 信息。

③ 然后判斷需要啟動的 Activity 所在進程是否已存在,不存在 AMS 通過 socket 通知 Zygote fork 進程,然后反射調(diào)用 ActivityThread 的 main(),創(chuàng)建 Instrumentation、Application 和 Activity 以及走生命周期流程。

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

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

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