码迷,mamicode.com
首页 > 移动开发 > 详细

Android Framework ActivityManagerService

时间:2014-11-30 00:55:29      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:android framework activitymanagerservice

ActivityManagerService


ActivityManagerService(简称:AMS)管理着应用程序中创建的所有组件(Activity、Service等),每个组件的信息与组件对应的进程信息都在管理范围内,包括内存释放潜规则。为了实现组件的管理,每个组件的状态变化都需要通知AMS,组件间的跨进程通信(IPC)也由AMS来搭建。 所以AMS相当重要,在源码中随处可见。

先看下AMS静态类结构图:

bubuko.com,布布扣

举例:启动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的结果,在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。


看以下时序图:

bubuko.com,布布扣

总结: 这种**native.java , **Proxy.java的remote proxy模式,proxy负责打包形参并发送,native负责接受包并调用具体实现。  比如源码中ContentProviderNative和ContentProvierProxy也是如此。

本文出自 “ITLIFE” 博客,请务必保留此出处http://xwteacher.blog.51cto.com/9653444/1584553

Android Framework ActivityManagerService

标签:android framework activitymanagerservice

原文地址:http://xwteacher.blog.51cto.com/9653444/1584553

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!