一篇文章瞭解ActivityManagerService

一篇文章瞭解ActivityManagerService

1.1 Activity啓動過程看AMS

在閱讀Android源碼時,我們總會看到很多關於AMS相關的代碼,那麼AMS到底是什麼呢?一個服務?還是隻是單單具象的一個類?接下來我們從Activity啓動過程看下AMS到底起到什麼作用。

1.1.0 Android 28 AMS家族

在Activity的啓動過程中會調用到AMS

Instrumentation

描述: 實現應用程序檢測代碼的基類。運行時打開檢測,這個類將爲您實例化在任何應用程序代碼之前,允許您監視所有的系統與應用程序的交互。

在Activity的啓動過程中會調用 Instrumentation的execStartActivity方法,
執行應用程序發出的startActivity調用。默認的實現負責更新任何活動

   public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {
        IApplicationThread whoThread = (IApplicationThread) contextThread;
        Uri referrer = target != null ? target.onProvideReferrer() : null;
        if (referrer != null) {
            intent.putExtra(Intent.EXTRA_REFERRER, referrer);
        }
       ……
        try {
            intent.migrateExtraStreamToClipData();
            intent.prepareToLeaveProcess(who);
            int result = ActivityManager.getService()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);
            checkStartActivityResult(result, intent);
        } catch (RemoteException e) {
            throw new RuntimeException("Failure from system", e);
        }
        return null;
    }

繼續看下 ActivityManager.getService()
ActivityManager

我們可以看到getService方法調用了 IActivityManagerSingleton 的get()方法,IActivityManagerSingleton是一個單例。在註釋1處得到IBinder類型的AMS的引用,在註釋2處將它轉換成IActivityManager類型,這段代碼採用的是AIDL,主要實現進程間通信,服務器端也就是AMS只需要繼承IActivityManagerStub類並實現相應的方法就可以了。因此 上一段話的execStartActivity實際調用的就是AMS的execStartActivity方法。

    public static IActivityManager getService() {
        return IActivityManagerSingleton.get();
    }
    
        private static final Singleton<IActivityManager> IActivityManagerSingleton =
            new Singleton<IActivityManager>() {
                @Override
                protected IActivityManager create() {
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);//1
                    final IActivityManager am = IActivityManager.Stub.asInterface(b);//2
                    return am;
                }
            };

1.1.1 小結

ActivityManager的getService方法會得到IActivityManager,AMS只需要繼承IActivityManager.Stub類,就可以和ActivityManager實現進程間通信了。

參考:劉望舒《Android進階解密》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章