1. 程式人生 > >android aidl 分析(PowerManager)

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物件,就像得到了本地的某個物件一樣,可以呼叫其遠端的方法。