天天看点

Android IPC机制及Binder原理

参考地址:

http://blog.csdn.net/xiangzhihong8/article/details/61629899

http://blog.csdn.net/qq_30379689/article/details/72550701#面向对象和面向过程的区别

在Activity和Service进行通讯的时候,都会用到了Binder。

  • 当属于同个进程我们可以继承Binder然后在Activity中对Service进行操作。
  • 当不属于同个进程,那么要用到AIDL让系统给我们创建一个Binder,然后在Activity中对远端的Service进行操作。

系统给我们生成的Binder:

  • Stub类中有:接口方法的id,有该Binder的标识,有asInterface(IBinder)(让我们在Activity中获取实现了Binder的接口,接口的实现在Service里,同进程时候返回Stub否则返回Proxy),有onTransact()这个方法是在不同进程的时候让Proxy在Activity进行远端调用实现Activity操作Service。
  • Proxy类是代理,在Activity端,其中有:IBinder mRemote(这就是远端的Binder),两个接口的实现方法不过是代理最终还是要在远端的onTransact()中进行实际操作。

哪一端的Binder是副本,该端就可以被另一端进行操作,因为Binder本体在定义的时候可以操作本端的东西。所以可以在Activity端传入本端的Binder,让Service端对其进行操作称为Listener,可以用RemoteCallbackList这个容器来装Listener,防止Listener因为经历过序列化而产生的问题。

当Activity端向远端进行调用的时候,当前线程会挂起,当方法处理完毕才会唤醒。

如果一个AIDL就用一个Service太奢侈,所以可以使用Binder池的方式,建立一个AIDL其中的方法是返回IBinder,然后根据方法中传入的参数返回具体的AIDL。

Android IPC机制及Binder原理