笔记:IPC机制

IPC机制


  • IPC简介
    Inter-Process Communication 进程间通信/跨进程通信----指两个进程间进行数据交换的过程。
    Android中进程间通信的方式是通过Binder方式

  • Android开启多进程方式
  1. 给四大组件在AndroidManifest中指定android:process属性
  2. 通过JNI在native层fork一个新的进程(不常用)

  • 进程名以:开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,
  • 进程名不以:开头的进程属于全局进程,其他应用通过ShareUID的方式可以和它跑在同一个进程中,需要两个应用有相同的ShareUID和签名,这样他们就可以互相访问私有数据。

  • 多进程的问题
    一个静态变量,在不同进程中修改它的值,不会同步到其他进程中,每个进程只会持有该静态变量的副本。

Android为每个应用分配一个独立的虚拟机,或者说每个进程分配一个独立的虚拟机,不同的虚拟机在内存地址分配上有独立的地址空间,这就会使在不同的虚拟机中访问同一个对象会产生多个副本

多进程会带来的问题

  • 实现跨进程通信的方式举例:
    Intent传输数据,共享文件和sharedpreference,基于Binder的Messenger,AIDL和Socket

  • 序列化Serializable中有个SerialVersionUID,作用:该id被序列化到文件中,当反序列化时,会取出该id与当前类的id比较,如果不一样,表示类中的属性发生了变化,一般是编译器自己通过hash计算生成,如果手动指定,则修改类不会报错。
  1. 静态成员变量属于类,不属于变量,不会参与序列化
  2. 用transient标记的变量不参与序列化过程

  • Parcelable接口
    一个类只要实现该接口,就可以实现序列化并通过Intent和binder传递
Parcelable

  • List Map也可以序列化,前提是内部元素可序列化

  • Parcelable主要用在内存序列化上

  • AIDL自动生成的java文件 p48

  • Binder的工作机制p50


    Binder的工作机制

  • 通过给Binder设置死亡代理,linkToDeath和unLinkToDeath p60

  • AIDL生成java-UML类图
    AIDL生成java-UML类图

  • Messenger,基于AIDL实现,使用p66

  • AIDL 支持的数据类型:
  1. 基本数据类型(int boolean long char double等)
  2. String 和 CharSequence
  3. List 只支持ArrayList,里面每个元素都必须被AIDL支持
  4. Map 只支持HashMap,里面每个元素都必须被AIDL支持,包括key和value,
  5. Parcelable :所有实现了Parcelable接口的对象
  6. AIDL所有的AIDL接口本身也可以在AIDL文件中使用

AIDL中除了基本数据类型外,其他数据类型必须都标上方向:in,out或inout,in表示输入型参数,out表示输出型,inout 表示输入输出型


  • RemoteCallBackList 系统专门提供用于删除跨进程listener接口的。
    底层是一个Map key为binder类型,value为listener接口类型,原理就是listener所对应的binder是唯一的。

  • SQLiteDatabase内部对数据库操作是有同步处理的。但如果有多个SQLiteDatabase,则无法保证线程间的同步

  • Binder 连接池 (p117)

大致是有多个业务Binder,然后创建一个Binder管理的AIDL文件,用于根据类型返回不同业务binder,然后服务端Service 只与管理Binder打交道,接收管理Binder返回的Binder,客户端则根据管理Binder查询自己需要的Binder再调用业务逻辑即可,这样就实现了简单的Binder连接池。


  • 各种AIDL实现的优缺点及使用场景


    各种AIDL实现的优缺点及使用场景
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容