在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封装也是类似。