AndroidFrameworkActivityManagerService

ActivityManagerService

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)麗水,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18980820575

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

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

Android Framework ActivityManagerService

舉例:?jiǎn)?dòng)Activity時(shí)類圖對(duì)象的交互

1.啟動(dòng)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可看成是單例的一個(gè)模板,getDefault()返回的是gDefault.get() 是返回Singleton.create的結(jié)果,在create方法中通過(guò) ServiceManager.getService("activity")所得到的對(duì)象既是AMS對(duì)象,從類圖中可以看出AMS也是一個(gè)IBinder對(duì)象, 得到AMS對(duì)象之后調(diào)用了asInterface方法為其使用遠(yuǎn)程代理即:ActivityManagerProxy。

那么得出結(jié)論是ActivityManagerNative.getDefault()得到是ActivityManagerProxy對(duì)象,緊接著調(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負(fù)責(zé)將形參打包到parcel并調(diào)用mRemote.transact發(fā)送START_ACTIVITY_TRANSACTION指令,屆時(shí)的mRemote對(duì)象既是AMS對(duì)象。AMS對(duì)象繼承ActivityManagerNative,ActivityManagerNative實(shí)現(xiàn)了onTransact,負(fù)責(zé)接受mRemote.transact發(fā)送的parcel包。并根據(jù)code即:START_ACTIVITY_TRANSACTION,調(diào)用AMS的實(shí)現(xiàn) startActivity方法。 屆時(shí),通過(guò)ActivityManagerProxy.startActivity已經(jīng)調(diào)用到AMS的startActivity。

看以下時(shí)序圖:

Android Framework ActivityManagerService

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

網(wǎng)站欄目:AndroidFrameworkActivityManagerService
標(biāo)題URL:http://muchs.cn/article40/gedjeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)標(biāo)簽優(yōu)化、網(wǎng)站維護(hù)、網(wǎng)站排名、動(dòng)態(tài)網(wǎng)站、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司