Android(安卓)IPC机制及Binder原理
16lz
2021-01-26
参考地址:
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。
更多相关文章
- 第14章 使用Kotlin 进行 Android(安卓)开发(1)
- Android(安卓)RecyclerView使用 及 滑动时加载图片优化方案
- android—OpenGL—GL10方法解析
- DialogFragment与Activity通信最佳实践
- 【Android】LitePal安装和使用
- Android(安卓)adb setuid提权漏洞的分析
- Android下调用jni时进行的转码操作实例
- Android启动流程以及分类
- android canvas 绘制bitmap并保存到本地