IPC

IPC概念

  1. 使用多进程:android:process属性android

  2. Android为每个进程都分配一个独立的虚拟机,致使在不一样的虚拟机中访问同一个类的对象会产生多份副本,即便是public static int sUerId = 1之类的静态变量也同样网络

  3. 使用多进程会形成:并发

    • 静态成员和单例模式彻底失效
    • 线程同步机制彻底失效
    • SharedPreferences的可靠性降低
    • Application屡次建立
  4. Serializable接口

    1. 要想让一个对象序列化,只须要这个类实现Serializable接口并声明一个serialVersionUID便可
  5. Parcelable接口

    1. 实现decribleContents方法,writeToParcel方法,和CREATOR
  6. Binder

Android实现IPC的方式

  1. 使用Bundleide

  2. 使用文件共享高并发

    • 有局限性,好比并发读写
    • 文件共享的方式适合在对数据同步要求不高的进程间进行通讯,而且要妥善处理并发读写的问题
    • 不建议在进程间通讯使用SharedPrefetences
  3. 使用Messenger线程

    • 只能串行的方式处理客户端发来的信息
    1. 服务端进程
      • 咱们须要在服务端建立一个Service,同时建立一个Handler并经过它来建立一个Messenger对象,而后在Service的onBind中返回这个Messenger对象底层的Binder便可
    2. 客户端进程
      • 首先绑定服务端的Service,绑定成功后用服务端返回的IBinder对象建立一个Messenger,经过这个Messenger就能够向服务端发送消息了,发送消息类型为Message对象。这就实现了客户端到服务端的通讯
      • 若是想要服务端回应客户端。须要在客户端建立一个Handler并建立一个新的Messenger,并把这个Messenger对象经过Message的replyTo参数传递给服务端,服务端经过这个replyTo参数就能够回应客户端
  4. 使用AIDLcode

    • AIDL是平常开发涉及进程间通讯时的首选
    1. 服务端
      • 首先建立一个Service,而后建立一个AIDL文件,将暴露给客户端的接口在这个AIDL文件中声明,最后在Service中,建立一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法,在Service的onBind方法中返回这个类的对象
    2. 客户端
      • 绑定Service,将服务端返回的Binder对象转成AIDL接口所属的类型,接着就能够调用AIDL中的方法了
    • 拓展:
      • 使用观察者模式,让服务端为被观察者,客户端为观察者
      • 用RemoteCallbackList来实现删除跨进程listener接口
      • 服务端进程意外中止,须要重连服务
        1. 给Binder设置DeathRecipient接听
        2. 或者在onServiceDisconnected中重连远程服务
      • 如何在AIDL中使用权限验证功能
        1. 能够在onBind中进行验证
        2. 在服务端的onTransact中进行验证
      • 用Binder链接池,将全部AIDL放在同一个Service中去管理
  5. 使用ContentProvider对象

  6. 使用Socket(“套接字”)继承

    1. Socket称为“套接字”,分为流式套接字和用户数据报套接字,分别对应于网络传输控制层中的TCP和UDP协议
名称 优势 缺点 使用场景
Bundle 简单 只能传输Bundle支持的数据类型 四大组件之间进程通讯
文件共享 简单 不适合高并发,没法作到进程间即时通讯 无并发访问情形
AIDL 一对多并发即时通讯 一对多通讯且有RPC需求
Messenger 一对多串行通讯,支持实时通讯 不能处理好高并发,不支持RPC, 低并发的一对多即时通讯,无RPC需求
ContentProvider 支持一对多并发数据共享, 理解为受约束的AIDL,主要提供CRUD操做 一对多进程间的数据共享
Socket 功能强大,经过网络传输字节流,支持一对多并发实时通讯 不支持直接RPC 网络数据交换

参考:《Android开发艺术探索》接口

相关文章
相关标签/搜索