Framework中的Proxy-Stub模式

Proxy-Stub模式是为了解决进程间通信问题而设计。(推荐阅读高焕堂先生的《android设计招式之美》)

在ActivityThread中,就利用了Proxy-Stub模式实现了与ActivityManagerService的进程间调用。

//ActivityThread.java

    private void attach(boolean system) {
        sCurrentActivityThread = this;
        mSystemThread = system;
        if (!system) {
            ViewRootImpl.addFirstDrawHandler(new Runnable() {
                public void run() {
                    ensureJitEnabled();
                }
            });
            android.ddm.DdmHandleAppName.setAppName("<pre-initialized>",
                                                    UserHandle.myUserId());
            RuntimeInit.setApplicationObject(mAppThread.asBinder());
            IActivityManager mgr = ActivityManagerNative.getDefault();
            try {
                mgr.attachApplication(mAppThread);
            } catch (RemoteException ex) {
                // Ignore
            }
        } else {
            // Don't set application object here -- if the system crashes,
            // we can't display an alert, we just want to die die die.
        }

        // add dropbox logging to libcore
     }
围绕ActivityManagerNative类我们可以找到下列类关系:

//ActivityManagerNative.java

1.public abstract class ActivityManagerNative extends Binder implements IActivityManager

2.class ActivityManagerProxy implements IActivityManager

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

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

 

//IActivityManager.java

5.public interface IActivityManager extends IInterface

//ActivityManagerService.java

6.public final class ActivityManagerService extends ActivityManagerNative
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback

可以得到以下类图:

我们详细分析一下:

首先,

ActivityManagerNative和ActivityManagerProxy继承同一个接口IActivityManager
ActivityManagerNative是一个Stub,是服务端,
ActivityManagerProxy是一个Proxy,是客户端。

其次
ActivityManagerNative的onTransact中调用自己的抽象函数,实际调用的是继承了ActivityManagerNative类的ActivityManagerService的相应函数。这样,调用Proxy的时候,Proxy会调用到ActivityManagerNative的onTransact里,之后就可以利用这种抽象继承机制调用到extends ActivityManagerNative的ActivityManagerService的函数。
(整个Framework中只在ActivityManagerNative.asInterface中有return new ActivityManagerProxy(obj);)

再看对象的本质:

ServiceManager中用了一个HashMap存储所有的Service,都是IBinder类型
在IActivityManager am = asInterface(b);中,由代码段4可知am就是一个ActivityManagerProxy对象了。
亦即gDefault是一个ActivityManagerProxy对象,所以调用的mgr就是一个ActivityManagerProxy对象

最后

可知mgr.attachApplication(mAppThread);调用的是ActivityManagerProxy.attachApplication函数。之后通过ActivityManagerNative(即Stub)就会调用到ActivityManagerService.attachApplication中。这样,就从ActivityThread中通过Proxy-Stub模式跨进程调用了ActivityManagerService的函数。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值