服装公司电商网站建设规划广州seo顾问
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方法就不再赘述了。
通过上面的源码,应该对源码中的代理模式有很深的理解了。