Android-ActivityManager框架解析

本文详细解析了Android系统中ActivityManager与ActivityManagerService之间的通信机制,包括关键类和方法的工作流程,以及Binder机制如何实现跨进程通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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抽象类,但是两个类的作用是不一样的,一个是作为代理,另外一个才是真正的实现功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值