Android Framework ActivityManagerService
ActivityManagerService(简称:AMS)管理着应用程序中创建的所有组件(Activity、Service等),每个组件的信息与组件对应的进程信息都在管理范围内,包括内存释放潜规则。为了实现组件的管理,每个组件的状态变化都需要通知AMS,组件间的跨进程通信(IPC)也由AMS来搭建。 所以AMS相当重要,在源码中随处可见。
先看下AMS静态类结构图:
举例:启动Activity时类图对象的交互
1.启动activity,看以下源码:
Instrumentation.ActivityResultar=mInstrumentation.execStartActivity(this,mMainThread.getApplicationThread(),mToken,this,intent,requestCode);
Instrumenttaion execStartActivity源码如下:
intresult=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()得到是什么? 看如下源码:
staticpublicIActivityManagergetDefault(){returngDefault.get();}privatestaticfinalSingleton<IActivityManager>gDefault=newSingleton<IActivityManager>(){protectedIActivityManagercreate(){IBinderb=ServiceManager.getService("activity");if(false){Log.v("ActivityManager","defaultservicebinder="+b);}IActivityManageram=asInterface(b);if(false){Log.v("ActivityManager","defaultservice="+am);}returnam;}};staticpublicIActivityManagerasInterface(IBinderobj){if(obj==null){returnnull;}IActivityManagerin=(IActivityManager)obj.queryLocalInterface(descriptor);if(in!=null){returnin;}returnnewActivityManagerProxy(obj);}
代码中Singleton可看成是单例的一个模板,getDefault()返回的是gDefault.get() 是返回Singleton.create的结果,在create方法中通过 ServiceManager.getService("activity")所得到的对象既是AMS对象,从类图中可以看出AMS也是一个IBinder对象, 得到AMS对象之后调用了asInterface方法为其使用远程代理即:ActivityManagerProxy。
那么得出结论是ActivityManagerNative.getDefault()得到是ActivityManagerProxy对象,紧接着调用ActivityManagerProxy.startActivity。 看一下源码:
publicintstartActivity(IApplicationThreadcaller,Intentintent,StringresolvedType,Uri[]grantedUriPermissions,intgrantedMode,IBinderresultTo,StringresultWho,intrequestCode,booleanonlyIfNeeded,booleandebug,StringprofileFile,ParcelFileDescriptorprofileFd,booleanautoStopProfiler)throwsRemoteException{Parceldata=Parcel.obtain();Parcelreply=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();intresult=reply.readInt();reply.recycle();data.recycle();returnresult;}
可以看出ActivityManagerProxy负责将形参打包到parcel并调用mRemote.transact发送START_ACTIVITY_TRANSACTION指令,届时的mRemote对象既是AMS对象。AMS对象继承ActivityManagerNative,ActivityManagerNative实现了onTransact,负责接受mRemote.transact发送的parcel包。并根据code即:START_ACTIVITY_TRANSACTION,调用AMS的实现 startActivity方法。 届时,通过ActivityManagerProxy.startActivity已经调用到AMS的startActivity。
看以下时序图:
总结: 这种**native.java , **Proxy.java的remote proxy模式,proxy负责打包形参并发送,native负责接受包并调用具体实现。 比如源码中ContentProviderNative和ContentProvierProxy也是如此。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。