Android IPC机制
IPC 即Inter-Process-Communication,含义是进程间通信/跨进程通信。是指多个进程间通信的过程,
那么什么是进程呢?
进程一般指一个执行单元,在Android中 通常是指一个应用程序,默认情况下一个APP只有一个进程。
线程又是什么?
线程是CPU调度的最小单元,也是有限的系统资源,同时一个进程中包含多个线程,所以进程和线程也是包含与被包含的关系。
为什么使用多进程?
如果APP由于一些原因,某些功能或模块需要独立的运行在一个进程中。又或者通过多进程获取更多的内存空间等。
为什么使用IPC?
上面已经提到IPC即跨进程通信,且一个进程通常指一个应用程序,因为每个进程或程序之间的内存不是共享的,但是我们又想在不同的进程间进行通信,这种情况下就需要IPC了。
实现IPC的方式有哪些?
Bundle、文件共享、AIDL、Messenger、ContentProvider、Socket等,在后面的内容中会逐一介绍。
目前我们已经了解了IPC以及实现的方式,那么在同一个APP中如何实现多进程呢?
其实App中实现多进程的方式很简单。只需要在Android的四大组件的AndroidMenifest中指定android:process属性即可。
<activity
android:name=".activity.MainActivity"
android:process=":test" />
<activity
android:name=".activity.MainActivity"
android:process="com.test.www.test" />
我们看以上两种方法,那么这两种有什么区别呢?
第一种 :test 进程名为当前的包名加上:之后的内容,以:开头的进程属于当前应用的私有进程,其他应用不可以和它跑在同一个进程中。
第二种 是一种完整的命名方式,其他的应用可以通过ShareUID的方式和它跑在同一个进程中。
到现在已经学会和如何实现APP多进程了,接下来简单介绍一下IPC中Bundle和文件共享。
Bundle:由于Bundle实现了Parcelable接口,所以它可以在进程间传输,所以我们可以通过Bundle附加我们想传递的信息,并通过Intent发送出去。需要注意的是 我们传输的数据必须能够被序列化,例如基本类型,以及实现了Parcelable的对象,例如实体类。
文件共享:文件共享也比较好理解,即两个进程通过读/写同一个文件来交换数据,比如A进程向文件中写入数据,B进程从这个进程中获取数据。使用文件共享需要注意的是多并发读写,虽然这是被允许的,但是可能出现数据不准确的问题。
目前IPC以及两种较为简单的IPC方式已经介绍完了,但是我们不可忽视的是,使用多进程会造成很多问题,例如:
1、静态成员和单例模式失效。
2、线程同步失效。
3、SharedPreferences的可靠性下降。
4、Application会创建多次。
正是为了解决这些问题,我们更应该学习和了解IPC了。
有哪里描述不对的地方欢迎交流指正,接下来的文章将介绍实现IPC的其他方式。