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