binder中的asInterface和asBinder

在binder的封装里,接口类如IPowerManager(stub,proxy)里包装了IBinder对象,

封装方法中提供了asInterface来根据IBinder来构造接口对象,如

IPowerManager adapter = IPowerManager.Stub.asInterface(ServiceManager.getService("power"));

同时,接口对象中可以使用asBinder来获取对应的IBinder对象。

 

在Android源码中,有个写法是很不规范的,

frameworks/base/services/core/java/com/android/server/Watchdog.java

340    void rebootSystem(String reason) {
341        Slog.i(TAG, "Rebooting system because: " + reason);
342        IPowerManager pms = (IPowerManager)ServiceManager.getService(Context.POWER_SERVICE);
343        try {
344            pms.reboot(false, reason, false);
345        } catch (RemoteException ex) {
346        }
347    }

在这里,由于执行该代码的进程和PowerManagerService所在的进程是同一个进程,即system_server,

所以,ServiceManager.getService 的返回值是Binder对象,即service对象本身who extends IPowerManager.stub that implements IPowerManager, 

这种情况下,执行没有问题,

但这样写是一个坑,如果在应用这这样写,就会出错,会提示,不能把BinderProxy对象转换为IPowerManager对象,

所以,应该采用标准写法,如 IPowerManager.Stub.asInterface

IPowerManager.Stub.asInterface方法中已经对IBinder对象进行了判断,对Binder对象和BinderProxy对象进行了区别处理。

 

Native层的binder封装也是类似。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值