“代理”

最近有准备面试的小伙伴问我JAVA中的代理是什么?

被这么突然被这么一问,感觉有点懵逼啊,于是赶紧对这点知识做个复习,在这做下记录。

“代理”这个名词我们都很熟悉,最常见的就是“火车票代售点”、“xxx化妆品代理”等等,那么代理的意思就是:我们可以不用真正的“主体”,就能够使用到“主体”里面的功能,访问到“主体”里面的某个属性。

那么总结一句话:“代理是为一个对象提供一个代理者,别人通过这个代理者能够完成对这个对象的访问。

Java中有两个代理方式,即静态代理和动态代理,但是实际上我们在做android开发的时候并没有刻意的去在意到底使用了哪种代理方式。比如我们在用工厂模式的时候就是在使用了一个简单的静态代理。

ok,我们现在联想一下ActivityManager的工作任务。

ActivityManager.AppTask
ActivityManager.MemoryInfo
ActivityManager.ProcessErrorStateInfo
ActivityManager.RecentTaskInfo
ActivityManager.RunningAppProcessInfo
ActivityManager.RunningServiceInfo
ActivityManager.RunningTaskInfo
ActivityManager.TaskDescription

但是这些工作任务并不是由ActvityManager本身完成的,我们细看源码的话,会发现真正处理这些任务的“角色”是

ActivityManagerNative.getDefault()

然后就会找到ActivityManagerProxy
再往下看的话就能够看到AMS了,那么他们之间的关系大致是这样的

ActivityManagerProxy代理类是ActivityManagerNative的内部类;
ActivityManagerNative是个抽象类,真正发挥作用的是它的子类ActivityManagerService(系统Service组件)

那么实际上ActivityManager的操作流程是,通过ActivityManager去拿到ActivityManagerNative中的一个代理类,就是ActivityManagerProxy,然后这个代理类就会可以通过进程间通信拿到ActivityManagerService,然后再去做真正的任务。

ok,let me show you the code:(简化后的伪代码,这是代码还套了几层)

ActivityManager:

public class ActivityManager{
  doProcessThings(){
  ActivityManagerNative.getDefault().doProcessThings();
    }    
}

上面的代码是我们简单模仿ActivityManagerService进行处理,因为AMS在处理某些逻辑的时候,它是放到C语言中去处理的,所以我们拿ActivityManagerService的时候并不是很方便,这个时候我们是通过一个AMS的代理去操作的。

ok,以上是对代理的一小点总结,如果有时间的话,我会再细致的记录一下的。

have a good time~~~