IPC机制

IPC 全称 Inter-Process Communication 是进程间通信,是指两个进程间进行数据交换的过程。

IPC机制的使用场景:

  1. Android对单个应用使用的最大内存做了限制,需要获取更多的内存
  2. 当前应用需要向其他应用获取数据

开启多进程模式的唯一方法是在清单文件中设置 process 属性。例如

android:process=":remote" 

android:process="com.lzx.app.remote"

第一种是一种简写,完整是这样的:

android:process="com.lzx.app:remote"

第二种是一种完整的写法,带有 “:” 符号的属于当前应用的私有进程.

Parcelable接口:
Parcelable 接口是 Android 中实现序列化和反序列化的接口。并可以通过 Intent 和 Binder 传递。
注意 Parcelable 接口中的 Parcel 参数,Parcel 是一个偏底层的东西。内部包装了可序列化的数据,可以在 Binder 中自由传输。

序列化功能由 writeToParcel 方法来完成,通过 Parcel 的一系列 wirte 方法来完成的。
反序列化功能由 CREATOR 来完成,内部表明了如何创建序列化对象和数组,通过 Parcel 的一系列 read 方法完成。

Binder:
Binder 非常复杂和重要,它继承了 IBinder 接口。
从 IPC 角度看,Binder 是 Android 中一种跨进程通信的方式。
从 Android Framework 角度看,Binder 是 ServiceManager 连接各种Manager(ActivityManager、WindowManager) 和相应 ManagerService 的桥梁。
从应用层的角度看,Binder 是客户端和服务端进行通信的媒介。

在开发中,Binder 主要用在 Service,如果是普通的 Service,Binder 不涉及进程间通信。

Android 中的 IPC 方式:

**1. Bundle **
因为 Intent 支持传递 Bundle 数据,而且 Bundle 实现了 Parcelable 接口,所以可以方便的进行进程间传输。

2. 使用文件共享
使用文件要注意一个问题,就是并发读/写的问题,有可能读出的内容有可能不是最新的,并发写的话就更严重,因此尽量避免并发写这种情况的发生或者靠虑使用线程同步来限制多个线程的写操作。
注意,SharedPreferences 是个特例,虽然它属于文件的一种,但是系统对它的读/写有一定的缓存策略,所以在多进程模式下,系统对它的读/写变得不可靠,当面对高并发的读/写时,SharedPreferences 很大几率会丢失数据。所以,不建议在进程间通信中使用 SharedPreferences

3. 使用Messenger
Messenger 通过它可以在不同进程中传递 Message 对象。底层实现是 AIDL。
构造方法:

public Messenger(Handler target){
    mTarget = target.getIMessenger();
}
public Messenger(IBinder target){
    mTarget = IMessenger.Stub.asInterface(target);
}

同时它一次处理一个请求,因此在服务端不用考虑线程同步问题。因为 Messenger 是以串行的方式处理客户端发来的消息,如果大量消息同时发送,服务端只能一条条处理。

4. 使用AIDL

5. 使用ContentProvider
ContentProvider 是 Android 中提供的专门用于不同应用间进行数据共享的方式。实现增删查改方法。如果要扩展,实现 call 方法。

6. 使用Socket
Socket 可以实现终端与终端之间的通信,那么它肯定可以实现进程之间的通信,不过用得较少,因为它是比较偏网络方面的。

你可能感兴趣的:(IPC机制)