創(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)圖:
舉例:?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í)序圖:
總結(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)