扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
创新互联主要从事成都网站设计、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务丽水,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
ActivityManagerService(简称:AMS)管理着应用程序中创建的所有组件(Activity、Service等),每个组件的信息与组件对应的进程信息都在管理范围内,包括内存释放潜规则。为了实现组件的管理,每个组件的状态变化都需要通知AMS,组件间的跨进程通信(IPC)也由AMS来搭建。 所以AMS相当重要,在源码中随处可见。
先看下AMS静态类结构图:
举例:启动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 SingletongDefault = new Singleton () { 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的结果,在create方法中通过 ServiceManager.getService("activity")所得到的对象既是AMS对象,从类图中可以看出AMS也是一个IBinder对象, 得到AMS对象之后调用了asInterface方法为其使用远程代理即:ActivityManagerProxy。
那么得出结论是ActivityManagerNative.getDefault()得到是ActivityManagerProxy对象,紧接着调用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并调用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也是如此。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流