IPC机制(Inter-Process Communucation)
Android中一个应用使用多个进程的方式即给四大组件在AndroidManifest中指定android:process属性。
使用多进程会造成以下几方面的问题:
(1)静态成员和单例模式完全失效。(因为进程之间需要中间层共享数据,无法直接通过内存共享)
(2)线程同步机制完全失效。同(1)
(3)SharedPreferences的可靠性下降。(不支持两个进程同时去执行写操作,否则导致一定几率的数据丢失)
(4)Aplication会多次创建。(组件跑在新的进程中,创建新进程的同时分配独立的虚拟机,这就是启动一个应用的过程)
IPC基础概念
Serializable接口
Java所提供的一个序列化接口,是一个空接口,为对象提供标准的序列化和反序列化。在使用Serializable接口时可以指定一个类似下面的标识即可自动实现默认的序列化过程。
private static final long serialVersionUID=8711368828010083044L;
不指定也可以实现序列化,不过对反序列化产生影响。因为反序列化时需要进行对UID检测是否一致。
Serializable序列化与反序列化可以采用ObjectOutputStream和ObjectInputStream实现。
//序列化过程 User user = new User (0, "jake", true); ObjectOutputStream out = new ObjectOutputStream ( new FileOutputStream("cache.txt")); out .writeobject (user); out.close () ; //反序列化过程 ObjectInputStream in = new ObjectInputStream( new FileInputStream("cache.txt") ); User newUser = (User) in.readobject () ; in.close ();
Parcelable接口
实现Parcelable接口,并重写接口的describeContents()、writeToParcel(@NonNull Parcel parcel, int i)两个方法。
Serializable与Parcelable的区别
Serializable是Java中的序列化接口,使用简单但开销大,序列化和反序列化过程需要大量I/O操作。硬盘操作
Parcelable是Android中的序列化接口,使用麻烦但效率高,主要用在内存序列化上
Binder
Android的一个类,实现IBinder接口。它是Android中的一种跨进程通信方式 ,也可以理解为一种虚拟的物理设备。设备驱动是/dev/binder,该通信在Linux中没有;从Android Framework角度来说,Binder是ServiceManager连接各种Manager和ManagerService的桥梁;从Android应用层来说是客户端和服务端进行通信的媒介。
Binder主要用在Service中,包括AIDL和Messenger。
AIDL中声明的接口在编译后生成的Java文件中产生相应的id来标识它们,用于在transact过程中识别客户端请求的是哪个方法。内部声明了一个Stub,Stub就是一个Binder,当客户端与服务端在一个进程时,调用不会跨进程的transact过程的方法,反之调用走transact过程,这由它内部代理类Proxy实现。
DESCRIPTOR
Binder的唯一标识,一般用当前Binder的类名表示
asInterface(android.os.IBinder obj)
将服务端Binder对象转换成客户端所需的AIDL接口类型对象
asBinder
返回当前Binder对象
onTransact
运行在服务端的Binder线程池中,当客户端发起跨进程请求时,远程请求会通过系统底层封装后交由此方法处理。当返回false时,那么客户端请求会失败。
Proxy#xxx(xxx为接口方法)
运行在客户端
Binder与其他IPC(Inter-Process Communication)机制相比具有以下优势:
高效性:Binder使用了基于共享内存和内核驱动的方式进行进程间通信,可以实现高性能的数据传输。与其他IPC机制相比,Binder在数据传输过程中减少了拷贝和序列化的次数,从而提高了通信的效率。
安全性:Binder提供了基于权限的访问控制,确保只有授权的进程可以访问特定的服务。它使用了UID(User ID)和PID(Process ID)来标识应用程序和服务,从而实现了更细粒度的访问控制。
多线程支持:Binder可以处理多线程并发访问的情况,并提供了线程同步和互斥的机制。这使得在多线程环境下进行进程间通信更加简单和安全。
异步通信:Binder支持异步通信,可以在请求和响应之间进行其他操作,提高了应用程序的响应速度和并发性能。
支持跨进程调用:通过Binder,应用程序可以直接调用其他进程中的方法,实现跨进程的函数调用。这种直接调用的方式更加简洁和高效,避免了复杂的序列化和反序列化过程。
综上所述,Binder相比其他IPC机制具有更高的性能、更好的安全性和更好的多线程支持,因此在Android系统中成为了主要的进程间通信机制。
Android中的IPC方式
Bundle
四大组件中有三大组件都支持Bundle(Activity、Service、Receiver),当然传输的数据必须能够被序列化,因为Bundle实现了Parcelable接口。
文件共享
两个进程通过读/写同一个文件来交换数据。但不建议使用SharedPreference。
Messenger
在不同进程中传递Message对象,底层实现AIDL。如果客户端需要响应服务端的信息,需要在客户端创建接受服务端消息的Messnger和Handler,并且把接收服务端回复的Messenger通过Message的replyTo参数传递给服务端,服务端可以通过replyTo参数回应客户端。
AIDL(Android Interface Definition Language)
AIDL支持以下数据类型:
基本数据类型:int、long、boolean、float、double、byte、char等。
String和CharSequence。
数组类型:支持基本数据类型和字符串类型的数组。
Parcelable类型:实现了Parcelable接口的自定义类,用于在进程间传输对象。
List类型:List<T>,支持基本数据类型和Parcelable类型的列表。
Map类型:Map<K, V>,支持基本数据类型和Parcelable类型作为键值对的映射。
Binder类型:IBinder,用于实现进程间通信。
ContentProvider
Android中专门用于不同应用间进行数据共享的方式。
Socket
流式套字节(TCP)和数据报文套字节(UDP)。
TCP面向连接的协议,提供稳定的双向通信功能。
UDP无连接通信,提供不稳定的单项通信。
Binder连接池
Binder连接池是一种机制,用于管理Binder对象的创建和复用,以提高系统性能和资源利用率。Binder连接池通过维护一定数量的Binder对象,使得进程间通信(IPC)过程中可以复用已经创建的Binder对象,减少了对象创建和销毁的开销。
Binder连接池的工作原理如下:
首先,当一个进程需要与另一个进程进行通信时,它会向Binder连接池请求一个Binder对象。
如果连接池中有可用的Binder对象,连接池会从中选择一个空闲的Binder对象,并将其分配给请求进程。
请求进程使用分配的Binder对象进行通信,完成后将其归还给连接池,以便其他进程可以复用它。
如果连接池中没有可用的Binder对象,它可以创建新的Binder对象,并将其分配给请求进程。
通过使用连接池,可以减少频繁创建和销毁Binder对象的开销,提高通信的效率和性能。同时,连接池还可以控制Binder对象的数量,避免资源过度占用和浪费。
需要注意的是,Binder连接池是由系统自动管理的,应用开发者不需要直接操作连接池。在使用Binder进行进程间通信时,系统会自动根据需要从连接池中获取或创建Binder对象,并进行适当的复用。
名称 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Bundle | 简单易用 | 只能传输 Bundle 支持的数据类型 | 四大组件间的进程间通信 |
文件共享 | 简单易用 | 不适合高并发场景,并且无法做到进程间的即时通信 | 无并发访问情形,交换简单的数据实时性不高的场景 |
AIDL | 功能强大,支持一对多并发通信,支持实时通信 | 使用稍复杂,需要处理好线程同步 | 一对多通信且有 RPC需求 |
Messenger | 功能一般,支持一对多串行通信,支持实时通信 | 不能很好处理高并发情形,不支持 RPC,数据通过 Message 进行传输,因此只能传输 Bundle支持的数据类型 | 低并发的一对多即时通信,无RPC 需求,或者无须要返回结果的 RPC需求 |
ContentProvider | 在数据源访问方面功能强大,支ContentProvider持一对多并发数据共享,可通过Call 方法扩展其他操作 | 可以理解为受约束的 ATDL,主要提供数据源的 CRUD 操作 | 一对多的进程间的数据共享 |
Socket | 功能强大,可以通过网络传输字节流,支持一对多并发实时通信 | 实现细节稍微有点烦琐,不支持直接的 RPC | 网络数据交换 |
IPC机制(Inter-Process Communucation)相关推荐
- RTT的IPC机制篇——IPC通信总结
总结1 RTT通信方式总结 2018年12月29日 10:47 IPC:inter process communication 1,RTT的通信机制: 消息队列.邮箱.信号量.互斥量.事件. 2.我又 ...
- Linux 进程间通信-IPC 机制
Linux 平台上在 Kernel 协调下完成进程之间的相互通信,有多种进程间通信 -- Inter Process Communication(IPC)方式. 1. IPC 分类 按照功能用途来看有 ...
- Binder相关面试总结(一):为什么Android要采用Binder作为IPC机制?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nwy9SoNo-1609925310525)(//upload-images.jianshu.io/upload_ima ...
- Android的IPC机制(一)——AIDL的使用
综述 IPC(interprocess communication)是指进程间通信,也就是在两个进程间进行数据交互.不同的操作系统都有他们自己的一套IPC机制.例如在Linux操作系统中可以通过管道. ...
- 为什么Android要采用Binder作为IPC机制?
作者:Gityuan 链接:https://www.zhihu.com/question/39440766/answer/89210950 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 在开 ...
- Android的IPC机制Binder
第一部分 Binder的组成 1.1 驱动程序部分驱动程序的部分在以下的文件夹中: Java代码 kernel/include/linux/binder.h kernel/drivers/andr ...
- 深入理解 Android 的 IPC 机制--------Binder
在android中,,应用程序虽然是以独立的进程来运行的,但相互之间还是需要通信..比如,,我们的应用程序 和后台服务往往会运行不同的进程当中,,各自有这独立内存地址空间,,,但是又要彼此互相合作,, ...
- 02.Android之IPC机制问题
目录介绍 2.0.0.1 什么是Binder?为什么要使用Binder?Binder中是如何进行线程管理的?总结binder讲的是什么? 2.0.0.2 Android中进程和线程的关系?什么是IPC ...
- Android IPC机制(五)用Socket实现跨进程聊天程序
1.Socket简介 Socket也称作"套接字",是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信.它分为流 ...
最新文章
- 在文件中查找指定字符串
- 减少过敏反应的生活细节
- matlab中fprintf函数的具体使用方法
- Hive2.1.1的安装教程(元数据放在本地Mysql)
- 3.1_ _2_ 内存管理的概念
- SpringMVC的上传和下载
- 【kafka】kafka 2.4 static membership功能 group.instance.id
- java高性能编程是什么,Java高性能编程
- hibernate级联保存问题
- meta 标签的详细使用
- java清除缓存池_Java 缓存池(使用Map实现)
- YANG-SUITE安装步骤
- adventnet trap
- 幼麟棋牌游戏进程分析
- 树莓派3B+(无显示器)实现串口登录
- 聊聊同步/异步/阻塞/非阻塞(举栗子说明)
- 希捷移动硬盘官方测试软件,2TB厚度仅9.6mm 希捷超薄移动硬盘测试
- Google 推出浏览器版Google Voice
- Flask 和 Django 的比较和选择
- linux修改字符集为amer,Linux数据库的创建 导入导出 以及一些基本指令
热门文章
- HTML中如何两行字如何顶格写,文件每行字都不顶格,如何做到顶格
- 组复制技术架构 | 深入浅出MGR
- matlab 动态存储图片,Matlab刷新图像及保存.gif动图的简单方法
- 用python画条形图
- 向“生物力学之父”冯元桢先生学习什么?【转载】
- wps python 自动化_Python3+Selenium+Chrome实现自动填写WPS表单
- 创业路上教你怎样躲开创业陷阱
- Magnolia cms
- 关于百度编辑器设置默认行间距段间距
- python函数的闭合:实现给定的单词输出复数形式