Android Binder跨进程通信,servicemanager.getService方法获取binder对象。
一.为什么binderservice可以跨进程绑定服务
主要是Android系统借助servicemanager的AMSt通过一些方法传递binder对象。
二.获取系统电量服务,也是跨进程通信
运行看看
三.分析源码(基于Android-10.0.0_r41)
在ContextImpl实现类中
进入SystemServiceRegistry
注册我们的电源管理服务
本质上还是调用了我们的servicemanager进行跨进程
registerService(Context.BATTERY_SERVICE, BatteryManager.class,
new CachedServiceFetcher<BatteryManager>() {
@Override
public BatteryManager createService(ContextImpl ctx) throws ServiceNotFoundException {
//我们熟悉的,可以看出是跨进程通信,转换成接口
IBatteryStats stats = IBatteryStats.Stub.asInterface(
ServiceManager.getServiceOrThrow(BatteryStats.SERVICE_NAME));
IBatteryPropertiesRegistrar registrar = IBatteryPropertiesRegistrar.Stub
.asInterface(ServiceManager.getServiceOrThrow("batteryproperties"));
return new BatteryManager(ctx, stats, registrar);
}});
都是返回IBinder对象