溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android Framework ActivityManagerService

發(fā)布時間:2020-07-18 05:21:56 來源:網(wǎng)絡(luò) 閱讀:1016 作者:小偉老師 欄目:移動開發(fā)

ActivityManagerService


ActivityManagerService(簡稱:AMS)管理著應(yīng)用程序中創(chuàng)建的所有組件(Activity、Service等),每個組件的信息與組件對應(yīng)的進程信息都在管理范圍內(nèi),包括內(nèi)存釋放潛規(guī)則。為了實現(xiàn)組件的管理,每個組件的狀態(tài)變化都需要通知AMS,組件間的跨進程通信(IPC)也由AMS來搭建。 所以AMS相當重要,在源碼中隨處可見。

先看下AMS靜態(tài)類結(jié)構(gòu)圖:

Android Framework ActivityManagerService

舉例:啟動Activity時類圖對象的交互


1.啟動activity,看以下源碼:

Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode);


Instrumenttaion execStartActivity源碼如下:


int result = ActivityManagerNative.getDefault()
                .startActivity(whoThread, intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        null, 0, token, target != null ? target.mEmbeddedID : null,

                        requestCode, false, false, null, null, false);


代碼中ActivityManagerNative.getDefault()得到是什么? 看如下源碼:


 static public IActivityManager getDefault() {
        return gDefault.get();
 }


private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
        protected IActivityManager create() {
            IBinder b = ServiceManager.getService("activity");
            if (false) {
                Log.v("ActivityManager", "default service binder = " + b);
            }
            IActivityManager am = asInterface(b);
            if (false) {
                Log.v("ActivityManager", "default service = " + am);
            }
            return am;
        }
    };
static public IActivityManager asInterface(IBinder obj) {
        if (obj == null) {
            return null;
        }
        IActivityManager in =
            (IActivityManager)obj.queryLocalInterface(descriptor);
        if (in != null) {
            return in;
        }

        return new ActivityManagerProxy(obj);
    }


代碼中Singleton可看成是單例的一個模板,getDefault()返回的是gDefault.get() 是返回Singleton.create的結(jié)果,在create方法中通過 ServiceManager.getService("activity")所得到的對象既是AMS對象,從類圖中可以看出AMS也是一個IBinder對象, 得到AMS對象之后調(diào)用了asInterface方法為其使用遠程代理即:ActivityManagerProxy。


那么得出結(jié)論是ActivityManagerNative.getDefault()得到是ActivityManagerProxy對象,緊接著調(diào)用ActivityManagerProxy.startActivity。 看一下源碼:


 public int startActivity(IApplicationThread caller, Intent intent,
            String resolvedType, Uri[] grantedUriPermissions, int grantedMode,
            IBinder resultTo, String resultWho,
            int requestCode, boolean onlyIfNeeded,
            boolean debug, String profileFile, ParcelFileDescriptor profileFd,
            boolean autoStopProfiler) throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
        intent.writeToParcel(data, 0);
        data.writeString(resolvedType);
        data.writeTypedArray(grantedUriPermissions, 0);
        data.writeInt(grantedMode);
        ...
        mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
        reply.readException();
        int result = reply.readInt();
        reply.recycle();
        data.recycle();
        return result;
    }



可以看出ActivityManagerProxy負責將形參打包到parcel并調(diào)用mRemote.transact發(fā)送START_ACTIVITY_TRANSACTION指令,屆時的mRemote對象既是AMS對象。AMS對象繼承ActivityManagerNative,ActivityManagerNative實現(xiàn)了onTransact,負責接受mRemote.transact發(fā)送的parcel包。并根據(jù)code即:START_ACTIVITY_TRANSACTION,調(diào)用AMS的實現(xiàn) startActivity方法。 屆時,通過ActivityManagerProxy.startActivity已經(jīng)調(diào)用到AMS的startActivity。


看以下時序圖:

Android Framework ActivityManagerService

總結(jié): 這種**native.java , **Proxy.java的remote proxy模式,proxy負責打包形參并發(fā)送,native負責接受包并調(diào)用具體實現(xiàn)。  比如源碼中ContentProviderNative和ContentProvierProxy也是如此。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI