使用Intent
- Activity、Service、Receiver都支持在Intent中传递Bundle数据,而Bundle实现了Parcelable接口。可以在不同的进程间进行传输。
- 在一个进程中启动两外一个进程的Activity、Service、Receiver,可以在Bundle中附加要传递的数据通过Intent发送出去。
使用文件共享
- Android 系统基于 Linux ,使得其并发读取文件没有限制地进行,甚至允许两个线程同时对一个文件进行读写操作,尽管这样可能会出问题。
- 可以在一个进程中序列化一个对象到文件系统中,在另一个进程中反序列化恢复这个对象。
- SharedPreferences 是个特例,系统对它的读 / 写有一定的缓存策略,即内存中会有一份 ShardPreferences 文件的缓存,系统对他的读 / 写就变得不可靠,当面对高并发的读写访问,SharedPreferences 有很多大的几率丢失数据。因此,IPC 不建议采用 SharedPreferences。
使用Messageer
- Messager是一个轻量级的IPC方案,底层实现是AIDL,可以在不同进程中传递Message对象,一次只处理一个请求。
- 这里客户端和服务端都是通过获取对方的messager来发送messgae。Messager中有一个Handler以串行的方式处理队列中的消息。不存在并发执行。如果大量消息同时发送到服务端,服务端只能一个一个处理,所以大量并发请求就不适合使用Messager,而且Messager只适合传递消息,不能跨进程调用服务端的方法。
使用AIDL
- Messager本质上也是AIDL,只不过是戏同做了封装方便上层调用,但是是Messager存在并发和跨进程调用方法的问题。而AIDL则可以解决并发和跨进程调用方法的问题。
- AIDL支持的数据类型
2.1 基本数据类型
2.2 String和CharSequence
2.3Parcelable,实现Parcelable接口的对象(PS:AIDL文件中用到了自定义的Parcelable对象,必须新建一个和他同名的AIDL文件。)
2.4 ArrayList,里面的元素必须能够被AIDL支持
2.5HashMap,里面的元素必须能够被AIDL支持
使用ContentProvider
- 用于不同应用间数据共享,和Messager底层实现同样是Binder和AIDL,系统做了封装。