Android艺术|IPC机制学习

IPC机制学习

文章目录

1)IPC基础及概念
2)Binder机制
3)IPC方式


IPC基础及概念

  • 1.多进程模式
    • 进程与线程
      • 进程,一般指一个执行单元,在PC和移动设备上指一个程序或应用
      • 线程,CPU调度的最小单元
      • 一个进程可包含多个线程,即一个应用程序上可以同时执行多个任务
      • 开启多进程的方式
        • 在AndroidMnifest中给四大组件指定属性android:process
        • 进程名的命名规则:
          • 以":"开头的进程,属于当前应用的私有进程
          • 完整命名,属于全局进程
      • 查看进程信息的方法
        • 通过DDMS视图查看进程信息
      • 多进程造成的影响
        • 静态变量和单例模式失效
        • 线程同步机制失效
        • SharedPreference的不可靠性下降
        • Applcation多次创建
          • Android系统会为新的进程分配独立的虚拟机,相当于系统又把这个应用重新启动了一次
  • 2.序列化
    • 含义
      • 将一个对象转换成可存储或传输的状态,序列化后的对象可以在网络上进行传输,也可以存储到本地
      • 需要通过Intent和Binder等传输类对象就必须完成对象的序列化过程。
      • 静态成员变量属于类,不属于对象,所以它和和用transient关键字标记的成员变量不参与序列化。
    • 实现方式
      • Serializable

        • Java的序列化接口,将一个对象转换成可存储或可传输的状态
        • 简单但效率较低,开销大
        • 适合将对象序列化到存储设备或者将对象序列化到网络设备传输
        • 序列化后的数据中的serialVersionUID要和当前类的serialVersionUID相同才能正常的序列化
      • Parcelable

        • Android的序列化接口,将一个对象进行分解,且分解后的每一部分都是传递可支持的数据类型
        • 高效但比较麻烦
        • 用在内存的序列化

Binder机制

  • 1.概念
    • 是一个类,实现IBinder接口
    • 是Android中的一种跨进程通信的方式
    • ServiceManager连接各种Manager和相应的ManagerService的桥梁
  • 2.优点
    • a.传输效率高、可操作性强。传输效率主要影响因素是内存拷贝的次数,拷贝次数越少,传输速率越高
      • 对于消息队列、Socket和管道来说,数据先从发送方的缓存区拷贝到内核开辟的缓存区中,再从内核缓存区拷贝到接收方的缓存区,一共两次拷贝
      • 对于Binder来说,数据从发送方的缓存区拷贝到内核的缓存区,而接收方的缓存区与内核的缓存区是映射到同一块物理地址的,节省了一次数据拷贝的过程
    • b.实现C/S架构方便
    • c.安全性高
  • 3.角色
    • Server,Client,ServiceManager和Binder驱动
      • ServiceManager:服务的管理者,将Binder名字转换为Client中对该Binder的引用,使得Client可以通过Binder名字获得Server中Binder实体的引用
      • Server和Client:服务端与客户端,在Binder驱动和Service Manager提供的基础设施上,进行Client-Server之间的通信
  • 4.工作原理
    • 服务器端:在服务端创建好了一个Binder对象后,内部就会开启一个线程用于接收Binder驱动发送的消息,收到消息后会执行onTranscat(),并按照参数执行不同的服务端代码。
    • Binder驱动:在服务端成功Binder对象后,Binder驱动也会创建一个mRemote对象(也是Binder类),客户端可借助它调用transcat()即可向服务端发送消息。
    • 客户端:客户端要想访问Binder的远程服务,就必须获取远程服务的Binder对象在Binder驱动层对应的mRemote引用。当获取到mRemote对象的引用后,就可以调用相应Binder对象的暴露给客户端的方法。

IPC方式

  • 跨进程通信,两个进程之间进行数据交换的过程
  • 应用场景:
    • 某些模块因特殊原因要运行在单独线程中
    • 为加大一个应用可使用的内存,需要用过多进程来获取多份内存空间
  • 1.使用Bundle
    • 支持在Activity、Service和Receiver之间通过Intent.putExtra()传递Bundle数据。
  • 2.文件共享
    • 无并发访问情形,交换简单的数据实时性不高的场景
  • 3.AIDL
    • 如果在一个进程中要调用另一个进程中对象的方法,可使用AIDL生成可序列化的参数,AIDL会生成一个服务端对象的代理类,通过它客户端实现间接调用服务端对象的方法。
    • AIDL的本质是系统提供了一套可快速实现Binder的工具
  • 4.Messager
    • 轻量级的IPC方案,通过它可在不同进程中传递Message对象
  • 5.ContentProvider
    • 是Android提供的专门用来进行不同应用间数据共享的方式
    • 除了onCreat()运行在UI线程中,其他的query()、update()、insert()、delete()和getType()都运行在Binder线程池中。
  • 6.Socket
    • 不仅可以跨进程,还可以跨设备通信
    • 流套接字
      • 基于TCP协议,采用流的方式提供可靠的字节流服务。
    • 数据报套接字
      • 基于UDP协议,采用数据报文提供数据打包发送的服务。
      • 不能在主线程中访问网络

参考

《Android开发艺术与探索》
关于Android多进程
要点提炼|开发艺术之IPC

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章