您好,登錄后才能下訂單哦!
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)圖:
舉例:啟動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。
看以下時序圖:
總結(jié): 這種**native.java , **Proxy.java的remote proxy模式,proxy負責打包形參并發(fā)送,native負責接受包并調(diào)用具體實現(xiàn)。 比如源碼中ContentProviderNative和ContentProvierProxy也是如此。
免責聲明:本站發(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)容。