android aidl 分析(PowerManager)

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对象,就像得到了本地的某个对象一样,可以调用其远程的方法。

猜你喜欢

转载自blog.csdn.net/u013885959/article/details/83991546