1: 每个aidl文件都会有一个对应的java文件(自动生成)
2:实现了PowerManager.Stub具体接口的IBinder服务
PowerManagerService.java中IBinder服务
private final class BinderService extends IPowerManager.Stub { 里面对aidl文件函数继承实现
3:添加IBinder服务到ServiceManager.addService
可以使用mPm = IPowerManager.Stub.asInterface(ServiceManager.getService(Context.POWER_SERVICE));
mPm调用 BinderService 实现的函数
PowerManagerService.java
@Override
public void onStart() {
publishBinderService(Context.POWER_SERVICE, new BinderService());
publishLocalService(PowerManagerInternal.class, new LocalService());
Watchdog.getInstance().addMonitor(this);
Watchdog.getInstance().addThread(mHandler);
}
4 PowerManager pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE)的调用
SystemServiceRegistry.java文件
registerService(Context.POWER_SERVICE, PowerManager.class,
new CachedServiceFetcher<PowerManager>() {
@Override
public PowerManager createService(ContextImpl ctx) {
IBinder b = ServiceManager.getService(Context.POWER_SERVICE);
IPowerManager service = IPowerManager.Stub.asInterface(b);
if (service == null) {
Log.wtf(TAG, "Failed to get power manager service.");
}
return new PowerManager(ctx.getOuterContext(),
service, ctx.mMainThread.getHandler());
}});
AIDL总结
1、AIDL要是实现的最终目标是跨进程访问,简单的说就是得到另一个进程的对象,并调用其方法。
2、AIDL与接口类似,本质属性都是一个Interface(AIDL文件是IInterface,而Interface是继承自Interface的),而且都只定义了抽象方法,没有具体的实现,需要子类去实现。
3、与接口不同的是:由AIDL生成的stub类本质上是一个Binder!这个类所生成的对象有两种方式可以传递给另外一个进程:
3.a、一种是通过bindService的方式,绑定一个服务,而在绑定后,服务将会返回给客户端一个Binder的对象,此时可以把继承自stub的Binder传递给客户端。
3.b、另外一种就是把继承自stub的类提升为系统服务,此时,我们通过ServiceManager去得到当前的系统服务,ServiceManager就会把目标Service的Binder对象传递给客户端。
4、经过上面两种方法得到的Binder对象,就像得到了本地的某个对象一样,可以调用其远程的方法。