美文网首页javaAndroid
Android进程间通信

Android进程间通信

作者: 大智先生 | 来源:发表于2019-02-22 09:51 被阅读12次

1. 简要说说进程与线程的区别和联系。

  1. 进程是系统进行资源分配的基本单位,线程是任务执行和调度的基本单位。

  2. 一个操作系统内可运行多个进程,每个进程拥有独立的数据空间;一个进程内可运行多个线程,多个线程共享所在进程的系统资源。

  3. 线程之间相互切换,资源开销较小;而进程之间相互切换,资源开销较大。

  4. 进程与线程都统一由CPU进行调度执行,进程是线程运行的基本环境,线程相当于进程的子任务,颗粒度较小。

2. 应用内使用多进程可能导致哪些问题?

当一个APP启用了多进程后,系统会为不同的进程分配不同的内存空间,因此所有需要通过内存共享的行为都会失败。另外,还会导致以下几个问题:

  1. 进程:Application会被多次创建,因为系统会为每一个进程分配独立的内存空间。
  2. 线程:线程同步失效,因为不同进程中的线程同步锁不是同一个对象。
  3. 内存:单例模式和静态变量失效,因为不同进程间的内存空间不同。
  4. 存储:SharedPreferences可靠性下降,因为系统对SharedPreferences有一定的缓存策略,多个进程同时读写可能会造成数据丢失。

3. Android中有哪些进程间通信方式?

名称 优点 缺点 适用场景
Bundle 简单易用 只能传输Bundle支持的数据类型 四大组件间的进程间通信
文件共享 简单易用 不适用高并发场景,并且无法做到进程间即时通信 适用于无关发的情况下,交换简单的数据,对实时性要求不高的场景。
AIDL 功能强大,支持一对多实时并发通信 使用稍复杂,需要处理好线程间的关系 一对多通信且有RPC需求
Messenger 功能一般,支持一对多串行通信,支持实时通信 不能很好地处理高并发的情形,不支持RPC,由于数据通过Message传输,因此只能传输Bundle支持的数据类型 低并发的一对多实时通信,无RPC需求,或者无需要返回结果的RPC需求
ContentProvider 支持一对多的实时并发通信,在数据源共享方面功能强大,可通过Call方法扩展其它操作 可以理解为受约束的AIDL,主要提供对数据源的CRUD操作 一对多的进程间数据共享
BroadcastReceiver 操作简单,对持一对多实时通信 只支持数据单向传递,效率低且安全性不高 一对多的低频率单向通信
Socket 功能强大,可通过网络传输字节流,支持一对多实时并发通信 实现细节步骤稍繁琐,不支持直接的RPC 网络间的数据交换

由于不同的进程拥有不同的数据空间,所以无论是应用内还是应用间,均无法通过共享内存来实现进程间通信。

参考资料

进程和线程的主要区别(总结) - CSDN

线程和进程的区别是什么? - 知乎

Android 多进程通信之几个基本问题

面试题:IPC(跨进程通信)

相关文章

网友评论

    本文标题:Android进程间通信

    本文链接:https://www.haomeiwen.com/subject/andsyqtx.html