这个文集中文章主要是自己在学习中记录的重要知识点,方便日后查阅。
IPC简介
IPC:Inter-Process Communication
进程间通信或者跨进程通信
进程:在PC或者移动设备上一个程序或者应用,一个进程可以有多个线程
线程:是CPU调度的最小单元
Android里主线程也叫UI线程,只有在UI线程里才能操作界面元素
Android中多进程模式
Android中使用多进程只有一种方法:给四大组件在AndroidMenifest
中指定android:process
属性
多进程模式带来的问题
Android为每个进程都分配一个独立的虚拟机,不同的虚拟机在内存的分配上是不同的地址空间。这就导致在不同的虚拟机中访问同一个对象会产生多个副本,所有运行在不同进程的四大组件,只要他们之间需要通过内存来共享数据,都会共享失败。这是多进程带来的影响。
多进程还会带下如下问题
- 静态成员和单例模式失效
- 线程同步机制完全失效
- SharedPreferences可靠性下降
- Application多次创建
IPC基础概念
1.Serializable接口
这是Java提供的序列化接口,可以通过ObjectOutputStream
和ObjectInputStream
进行序列化和反序列化操作
注:通过Serializable
进行序列化和反序列化的对象内容是完全一样的,但两者并不是同一个对象。
2.Parcelable
只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递。系统中的Intent、Bundle、Bitmap等已经实现了该接口,可以直接序列化。Lsit、Map也可序列化,只要它们中的每个元素都是可以序列化的。
以上两种接口的异同
Serializable接口是Java中接口,使用简单开销大
Parcelable 接口是Android平台提供,使用略微复杂,效率高,优化使用此接口。
但是要是将对象序列化到设备或者用网络传输,过程就会稍显复杂,建议使用Serializable
3.Binder
Binder是Android实现Ibinder的一个类。
下面从不同角度来介绍Binder的概念:
- IPC角度:是Android种跨进程通信的方式
- 虚拟物理设备:设备驱动是/dev/binder
- Android Framework角度:Binder是ServiceManager连接各种Manager和相应ManagerService的桥梁
- Android应用层:是服务端和客户端通信的媒介。
Android中的IPC方式
1.使用Bundle
Activity、Service、Receiver都支持在Intent传递Bundle数据,由于Bundle实现了Parcelable接口,可以在不同进程中传输数据。
2.文件共享
就是第一个进程中将一个对象序列化到sd卡上的文件里,在第二个进程再将sd卡中的对象内容重新反序列化成对象。这两个对象是一样的,但本质上还是一个对象。
文件共享方式,适合对数据同步要求不高的进程间的通信,并要妥善处理并发读/写的问题。
不建议在进程间通信使用SharedPreferences,因为在高并发的读/写访问中,很容易会丢失数据。
3.使用Messenger
在Messenger中放入要传递的数据,就可以实现数据的进程间传递了,它的底层实现的是AIDL。
4.AIDL
(看的不是很清楚,待补充)
5.使用ContentProvider
这就是Android中提供的专门用于不同应用间数据共享的方式。其底层实现同样也是Binder。
6.使用Socket
简单来说就是通过网络通信,来实现跨进程通信。
Binder连接池
主要作用就是将每个业务模块的Binder请求统一转发到远程Service中,避免重复创建Service。