Android源码中的代理模式解析

Android源码下的比较经典的代理模式其中之一是ActivityManagerProxy代理类,其具体代理的ActivityManagerNative的子类ActivityManagerService,ActivityManagerService在这里就不在具体赘述了,这里主要梳理一下整个代理的框架。

ActivityManagerProxy是ActivityManagerNative的内部类,定义如下:

class ActivityManagerProxy implements IActivityManager

ActivityManagerProxy实现了IActivityManager的接口,该接口定义了一些Activity相关的接口方法,其中有些是我们平时用到的。

public interface IActivityManager extends IInterface {


	public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,
            String resolvedType, IBinder resultTo, String resultWho, int requestCode, int flags,
            ProfilerInfo profilerInfo, Bundle options) throws RemoteException;
	//...........
	public Intent registerReceiver(IApplicationThread caller, String callerPackage,
            IIntentReceiver receiver, IntentFilter filter,
            String requiredPermission, int userId) throws RemoteException;

	//...........

       public void unregisterReceiver(IIntentReceiver receiver) throws RemoteException;
	//...........

    public int bindService(IApplicationThread caller, IBinder token, Intent service,
            String resolvedType, IServiceConnection connection, int flags,
            String callingPackage, int userId) throws RemoteException;
    public boolean unbindService(IServiceConnection connection) throws RemoteException;

	//...........

	//...........
}

上面的这个IActivityManager相当于代理模式中的抽象主题Subject, ActivityManagerProxy相当于代理类Proxy,那么具体的实现主题角色RealSubject是谁呢?

其实就是上面提到的ActivityManagerNative子类ActivityManagerService。因为ActivityManagerNative也实现了抽象主题角色IActivityManager。

public abstract class ActivityManagerNative extends Binder implements IActivityManager


这几个类之间的关系可以用以下UML类图表示为:




通过UML类图可以清晰的看出,ActivityManagerProxy和ActivityManagerNative都实现了IActivityManager,严格来说,ActivityManagerProxy就是代理部分,而ActivityManagerNative就是真实部分,但是ActivityManagerNative抽象类,其并不能处理过多的逻辑,大部分逻辑的实现都是由其子类ActivityManagerService承担,ActivityManagerService是真正意义上的真实主题。所以可以说ActivityManagerService实现了IActivityManager的所有功能,比如启动Activity,绑定服务,注册广播等等,这些逻辑最终都是交给ActivityManagerService实现的。


ActivityManagerService是系统级的Service并且运行与独立的进程中,可以通过ServiceManager获取它,ActivityManagerProxy也运行与独立的进程中,两者之间的通信属于进程间通信,也就是IPC,通过上面的UML类图,可以看出,这里的IPC的方式是通过Binder实现的,Android系统中的Binder机制是一种非常重要的IPC方式。


ActivityManagerProxy在实际的逻辑处理中并未过多的被外部类调用,因为在Activity相关信息的类还有一个ActivityManager类,ActivityManager从名字上看出管理者Activity的信息,但是ActivityManager的大部分逻辑实现都交给ActivityManagerProxy了。


这里以ActivityManager的getAppTasks方法举例说明代理模式。


    public List<ActivityManager.AppTask> getAppTasks() {
        ArrayList<AppTask> tasks = new ArrayList<AppTask>();
        List<IAppTask> appTasks;
        try {
            appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());
        } catch (RemoteException e) {
            // System dead, we will be dead too soon!
            return null;
        }
        int numAppTasks = appTasks.size();
        for (int i = 0; i < numAppTasks; i++) {
            tasks.add(new AppTask(appTasks.get(i)));
        }
        return tasks;
    }


这个方法就是通过ActivityManagerNatived的gDefault方法获取一个IActivityManager对象,再通过其调用调用getAppTasks方法。ActivityManagerNatived的gDefault方法源码如下:

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

上面代码通过单例模式构造了Singleton<IActivityManager >类型的gDefault,其中通过ServiceManager.getService("activity");获取了一个系统级别及的Service,而这个Service其实就是ActivityManagerService,然后通过asInterface方法返回一个IActivityManager对象,传入的参数是ActivityManagerService的一个binder对象,相当于远程引用。下面再看asInterface方法,这个方法非常关键,代理模式在这个方法中也提现的淋漓尽致!!!


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


在这个方法的最后一句,new ActivityManagerProxy(obj);传入了ActivityManagerService的引用,构造了代理对象返回,这个刚好符合静态代理模式。


分析到这里,也就完成了创建持有ActivityManagerService的引用的代理ActivityManagerProxy的实例。也就是说,ActivityManagerNatived.gDefault返回的实质上时一个代理对象,ActivityManagerProxy的实例。


 appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());


上面代码实际上调用的是ActivityManagerProxy类中的getTasks方法,继续跟踪源码,查看ActivityManagerProxy的getTasks方法,源码如下:

    public List<IAppTask> getAppTasks(String callingPackage) throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeString(callingPackage);
        mRemote.transact(GET_APP_TASKS_TRANSACTION, data, reply, 0);
        reply.readException();
        ArrayList<IAppTask> list = null;
        int N = reply.readInt();
        if (N >= 0) {
            list = new ArrayList<>();
            while (N > 0) {
                IAppTask task = IAppTask.Stub.asInterface(reply.readStrongBinder());
                list.add(task);
                N--;
            }
        }
        data.recycle();
        reply.recycle();
        return list;
    }

这里的源码的逻辑就比较明确了,通过 mRemote.transact方法将数据打包跨进程传递给Server端的 ActivityManagerService处理并返回结果。ActivityManagerService的getAppTasks方法会被调用并返回结果, mRemote是IBinder对象,transact方法我们在aidl中已经详细说明过了,这里不再赘述,然后将返回数据的Binder对象解析获得数据,还是通过asInterface方法将Binder对象转换为我们需要的对象。

最后ActivityManagerService的getAppTasks方法就不再赘述了。

通过上面的源码,应该对源码中的代理模式有很深的理解了。


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值