Android-ActivityManager框架解析

来源:互联网 发布:ape转mp3软件 编辑:程序博客网 时间:2024/05/18 14:28

1.ActivityManager
作用:是与系统中所有正在运行着的Activity进行交互,对系统所有运行中的Activity相关信息(task,memory,service,app)进行管理和维护;提供了相应的接口用于获取这些信息。
2.ActivityManager与ActivityManagerService之间的通信
首先看下图(不是本人所画,但大致都是这样),ActivityManager类图:
这里写图片描述
这些类所在的文件如下:
其中Binder.java和IBinder.java分别在
frameworks/base/core/java/android/os/IBinder.java (为接口文件)
frameworks/base/core/java/android/os/Binder.java (实现了IBinder接口)
frameworks/base/core/java/android/app/IActivityManager.java (接口文件)
frameworks/base/core/java/android/app/ActivityManagerNative.java(类ActivityManagerNative和类ActivityManagerProxy在同一个文件中,其中ActivityManagerNative类继承Binder类并实现了IActivityManager中部分方法,所以ActivityManagerNative为抽象类,ActivityManagerProxy实现了IActivityManager中的所有方法,但是对activity的管理和维护却不是该类完成,后详述。)
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java (该类继承ActivityManagerNative类并实现了IActivityManager中的所有方法,该类完成对activity管理和维护的所有功能)
frameworks/base/core/java/android/app/ActivityManager.java(该类依赖ActivityManagerProxy类)

3.在了解通信过程之前先了解java中的继承的几个原则
1)子类继承了父类中不是私有的成员变量和成员方法,作为自己的成员变量和成员方法;
2)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量被隐藏;
3)子类中定义的成员方法和父类中定义的成员方法相同时,则父类中的成员方法被隐藏;(即调用方法时首先调用子类中的方法)

4.简单看一下这个getServices的执行过程,如下图所示:
这里写图片描述
其中ActivityManager的getRunningServices()方法的代码如下:

    public List<RunningServiceInfo> getRunningServices(int maxNum)            throws SecurityException {        try {            return ActivityManagerNative.getDefault()                    .getServices(maxNum, 0);        } catch (RemoteException e) {            // System dead, we will be dead too soon!            return null;        }    }

ActivityManagerNative.getDefault()方法的代码如下:

    static public IActivityManager getDefault() {        return gDefault.get();    }  其中gDefault变量的定义如下:    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;        }    };

asInterface()代码如下,从代码中看出,函数最后返回一个ActivityManagerProxy的一个实例对象。

    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);    }

此时完成了Service对象代理的创建。
当对该对象代理进行getServices(maxNum, 0)操作时,此时调用的是ActivityManagerProxy类中的方法getServices(maxNum,0),该方法的代码如下:

    public List getServices(int maxNum, int flags) throws RemoteException {        Parcel data = Parcel.obtain();        Parcel reply = Parcel.obtain();        data.writeInterfaceToken(IActivityManager.descriptor);        data.writeInt(maxNum);        data.writeInt(flags);        mRemote.transact(GET_SERVICES_TRANSACTION, data, reply, 0);        reply.readException();        ArrayList list = null;        int N = reply.readInt();        if (N >= 0) {            list = new ArrayList();            while (N > 0) {                ActivityManager.RunningServiceInfo info =                        ActivityManager.RunningServiceInfo.CREATOR                        .createFromParcel(reply);                list.add(info);                N--;            }        }        data.recycle();        reply.recycle();        return list;    }

该部分代码中的mRemote.transact(GET_SERVICES_TRANSACTION, data, reply, 0);其中mRemote为IBinder的一个对象,由于Binder继承IBinder类,所以该方法即为Binder类中的transact方法,如下:

    public final boolean transact(int code, Parcel data, Parcel reply,            int flags) throws RemoteException {        if (false) Log.v("Binder", "Transact: " + code + " to " + this);        if (data != null) {            data.setDataPosition(0);        }           //此处的方法已经被子类重写        boolean r = onTransact(code, data, reply, flags);        if (reply != null) {            reply.setDataPosition(0);        }           return r;    }   

onTransact方法在ActivityManagerNative类(该类继承了Binder类)中被重写,另外在ActivityManagerService类(继承ActivityManagerNative类)中又被重写以此,此处调用的onTransact方法为ActivityManagerService类中的方法。但是该类中的方法又调用了父类ActivityManagerNative中的onTransact方法,如下:

        try {             return super.onTransact(code, data, reply, flags);        } catch (RuntimeException e) {

在ActivityManagerNative类中方法中,onTransact方法代码巨长,但是都是有一个switch…case…语句构成,此处只给出一部分,如下:

   .....        case GET_SERVICES_TRANSACTION: {            data.enforceInterface(IActivityManager.descriptor);            int maxNum = data.readInt();            int fl = data.readInt();            //猜猜此处调用的是哪里的getServices(),是ActivityManagerProxy类中的,还是ActivityManagerService类中的?            List<ActivityManager.RunningServiceInfo> list = getServices(maxNum, fl);            reply.writeNoException();            int N = list != null ? list.size() : -1;            reply.writeInt(N);            int i;            for (i=0; i<N; i++) {                ActivityManager.RunningServiceInfo info = list.get(i);                info.writeToParcel(reply, 0);            }            return true;        }       ......

此处调用的getServices()方法为ActivityManagerService类中的getServices()方法。
至此,ActivityManager(Client)与ActivityManagerService(server)的通信过程就分析到这了。只要记住虽然ActivityManagerProxy类和ActivityManagerService类都实现了IActivityManager抽象类,但是两个类的作用是不一样的,一个是作为代理,另外一个才是真正的实现功能。

0 0