Android中的IPC方式

Android中的IPC

Bundle

四大组件中的三大组件(Activity,Service,Broadcast)都是支持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接口,所以方便在不同进程间传输。基于这一点,当我们在一个进程中启动了另一个进程的Activity、Service和Broadcast,我们就可以在Bundle中附加需要传输的数据并通过Intent传输出去。

文件共享

我们可以通过不同进程读/写同一个文件实现进程间通信,但是android系统基于Linux系统,其对并发读/写文件没有限制的,甚至多个线程同时对一个文件进行写操作也是没有限制,因此在使用时要自己注意并发的问题。我们通常可以采用避免并发读/写的发生或者考虑使用线程同步来限制多个线程的写操作。综上我们可以知道,文件共享的方式适合在对数据同步要求不高的进程间进行通信,并且需要妥善处理并发问题。

Android存在一个特殊的文件共享方式,SharePreferences,SharePreferences是android系统的一个轻量级存储方案,它通过键值对的方式存储数据,在底层实现上采用xml文件存储键值对,每个应用的SharePreferences文件都可以在当前包所在的data目录下查看到,一般来说,它的目录位于/data/data/package name/shared_prefs目录下,其中package name表示的是当前应用的包名。从本质上来说Sharepreferences也是属于文件的一种,但是由于系统对它的读/写有一定的缓存策略,即在内存中会有一份SharedPreferences文件的缓存,因此在多进程模式下,系统对它的读/写就变得不可靠,当面对高并发的读/写,SharePreferences有很大几率会丢失数据,因此,在多进程间通信中不建议使用Sharepreferences。

Messenger

Messenger是一种轻量级的IPC方案,它的底层实现是AIDL。Messenger的使用方法很简单,它对AIDL做了封装,使得我们可以更简便地进行进程间通信。它一次只处理一个请求,因此在服务端我们不需要考虑线程同步的问题。

Messenger的使用是依赖于Message进行的,传递的数据也受到message的限制。Message能使用的消息载体只有what,arg1,arg2,Bundler以及replyTo。Message的另一个字段object在同一个进程中是很实用的,但是在进程间通信的时候,在Android2.2之前是不支持object字段的,2.2之后也仅支持系统提供的实现了Parcelable接口的对象。这就意味着我们自己实现的Parcelable接口的对象是无法通过object字段进行传递的。

AIDL

AIDL是Android系统提供的一个用于用于进程间通信的工具。依赖AIDL文件生成特定的Binder代码,底层实现依赖Binder。AIDL文件关键是在AIDL文件的编写,如何编写此处不提,但是AIDL生成的文件还是Java文件,我们不用AIDL直接自己动手写实现也是可以的,那么为什么还要使用AIDL,主要是因为我们自己动手写Binder代码会比较的繁琐,Goodle既然封装好了为了开发效率我们还是应该使用的。

ContentProvider

ContentProvider是Android提供的专门用于不同进程间进行数据共享的方式。其底层实现仍然是Binder,但是它的使用要比AIDL简单的多。ContentProvider的数据可以是数据库存储也可以是其他方式存储,只需实现ContentProvider提供的几个方法就可以。

Socket

Socket也称为“套接字”,是网络通信中的概念,也可以大材小用的用于我们的进程间通信,但是在开销和写法难度上较上述的几种方式要大一点,如非必要不建议使用。这也是本文章讲述的唯一一个不依赖Binder通信的方式。

你可能感兴趣的:(Android)