第二章 IPC机制
16lz
2021-12-04
第二章 IPC机制
Android IPC简介
IPC 含义为进程间通信,是指两个进程间进行数据交换的过程。
在Android 中最有特色的进程间通信方式就是Binder,通过Binder可以轻松地实现进程间通信。同时,Android还支持Socket通信Android中的多进程模式
开启多进程模式
方法只有一个,就是在AndroidMenifest中给四大组件指定android:process属性。- ”com.ryg.chapter_2.remote”
这是一种完整的命名方式,属于全局进程,其他应用可以通过ShareUID方式可以和它跑在同一个进程。 - “com.ryg.chapter_2:remote”
是指在当前进程名前面附加上当前的包名,这是一种简写的方法。进程名以”:”开头的进程属于当前应用的私有进程,其他应用进程不可以和它跑同一个进程。
- ”com.ryg.chapter_2.remote”
多进程模式的运行机制
- Android为每一个应用分配了一个独立的虚拟机,或者说为每个进程都分配一个独立的虚拟机不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多个副本。
- 所有运行在不同进程中的四大组建爱你,只要它们只要需要通过内存来共享数据,都会共享失败,这也是多进程带来的影响。
多进程造成的问题:
- 静态成员和单例模式完全失效
- 线程同步机制完全失效
- SharePreference可靠性降低
- Application会多次创建
多模式中,不同进程的组件会拥有独立的虚拟机、Application、以及内存空间。
IPC基础概念
- Serializable接口
- 采用Serializable方式序列化对象,只需要把实现了Serializable接口的对象写入到文件中就可以快速恢复了,恢复后的对象和之前的对象内容完全一样,但是两者并不是同一个对象。
- serialVersionUID的工作机制:序列化的时候,系统会把当前类的serialVersionUID写入到序列化的文件中,当反序列化的时候,系统会去检测文件中的serialVersionUID,看它是否和当前类的serialVersionUID一致,如果一致就说明序列化的版本和当前的版本是相同的,可以成功反序列化。否则说明发生了变化。
- 静态成员变量属于类,不属于对象,所以不会参与序列化过程。其次使用了transient关键字标记的成员变量不参与序列化过程。
Parcelable接口
- Android提供的新的序列化接口。
- Itent、Bundle、Bitmap都实现了Parcelable接口。
Binder
- 工作机制:
- 工作机制:
Android 中的IPC方式
- 使用Bundle
传输的数据必须能够被序列化,比如基本数据类型,实现了Parcellable接口的对象,实现了Seriallizable接口的对象,以及一些Android支持的特殊对象。 - 使用文件共享
Android 系统基于Linux,使得其并发读写文件可以没有限制的进行,甚至两个线程同时对一个文件进行写操作都是允许的。
文件共享方式适合在对数据同步要求不高的进程之间进行通信。不建议在进程间通信中使用SharedPreferences - 使用 Messager
Messager一次处理一个请求,因此在服务端不用考虑线程同步问题。
- 使用AIDL
使用AIDL跨进程调用服务端方法
- 进程间通信的流程
- 服务端:
服务端首先要创建一个Service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明,最后在Service中实现这个AIDL接口即可 - 客户端:
客户端首先绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转成AIDL接口所属的类型,接着就可以调用AIDL中的方法了。
- 服务端:
- 实现解注册功能:
RemoteCallbckList是系统专门提供用于删除跨进程listener的接口。RemoteCallbackList 内部自动实现了线程同步功能,使用它来注册和解注册时,不需要做额外的线程同步工作。 - 重新连接远程服务
- 给Binder设置DeathRecipient监听,当Binder死亡时,我们会收到binderDied方法的回调,在binderDied方法中,我们可以重新连接远程服务。
- 在onServiceDisconnected中重新连接远程服务。
- 以上两种方法的区别,onServiceDisconnected在客户端的UI线程中被回调。binderDied在客户端的Binder线程池中被回调。
- 在AIDL中设置权限功能
- 使用permission验证,在onBind中验证,验证不通过,返回null
- 在服务端的onTransact方法中进行权限验证,验证失败返回false。
- 进程间通信的流程
- 使用ContentProvider
- 使用socket
- 使用Bundle
Binder线程池
工作机制:
每个验证模块创建自己的AIDL接口并实现此接口,这个时候不同业务模块之间不能有耦合,所有的实现细节要单独分开,然后向客户端提供自己的唯一标识和对应的Binder对象;对于服务端来说,只需要一个Service就可以了,服务端提供一个queryBinder接口,这个接口能够根据业务模块的特征来返回相应的Binder给他们,不同业务模块拿到所需要的Binder对象就可以进行远程方法的调用了。
6.选择合适的IPC方式
- Serializable接口
更多相关文章
- Android应用程序进程启动过程(前篇)
- Android属性系统
- Android(安卓)IPC机制
- Android应用程序请求SurfaceFlinger服务创建Surface的过程分析
- Android系统启动,用过安卓手机的都知道,你还不知道吗?
- Android之Handler用法总结
- Android开机执行指定shell脚本
- android Camera架构介绍
- Android应用程序开发的五大概念