理解 IPC, 进程间通信之前先聊一下进程和线程;
进程是系统资源分配的单位, 线程是系统调度的单位;
进程与线程是包含与被包含关系; 一个进程可以包含多个线程;
最简单的情况下, 一个进程中可以只有一个线程, 即主线程;
对于安卓来说, 主线程也叫做 UI 线程;
只有在 UI 线程里才能操作界面元素;
很多时候一个进程需要执行大量的耗时任务, 如果把这些任务都放在主线程中会导致无法对用户操作及时响应;
这会严重影响用户体验, 安卓是有个异常叫做 ANR,Application Not Responding;
为了解决这个问题, 就需要用到线程, 把一些耗时的任务放到线程中;
==================================================
任何操作系统都需要有对应 IPC 机制, 这不是安卓特有的;
Windows 上有剪贴板, 管道, 邮槽用于进程间通信;
Linux 上可以通过命名管道, 共享内容, 信号量等来进行进程间通信;
不同的操作系统平台有着不同的进程间通信方式;
对于安卓来说, 是一个基于 Linux 内核的移动操作系统, 它的进程间通信方式并不能完全继承自 Linux;
它有自己的进程间通信方式;
最具特色的就是 Binder, 此外还有 Socket,Socket 也可以用于任意两个终端之间的通信.
==================================================
多进程的场景:
1, 应用因为某些原因自身需要采用多进程模式来实现, 原因可能有很多, 例如有些模块可能由于特殊的原因需要运行在单独进程中等;
2, 当前应用需要向其他应用获取数据, 由于是两个应用, 所以必须跨进程的方式来获取数据. 目前用的是 ContentProvider, 其实际上也是 IPC 通信, 只不过实现细节被屏蔽了;
==================================================
开启多进程模式
这里讨论一下一个应用中存在多个进程的情况;
在安卓中使用多进程只有一个办法, 就是给四大组件在 AndroidManifest 中指定 Android:process 属性;
安卓系统会为每个应用分配一个唯一的 UID, 具有相同 UID 的应用才能共享数据;
两个应用通过 ShareUID 跑在同一个进程中是有要求的, 这两个应用有相同的 ShareUID, 并且签名相同;
在这种情况下, 它们可以互相访问对方的私有数据.
==================================================
运行多进程模式
安卓为每个应用分配了一个独立的虚拟机, 或者说为每个进程都分配了一个独立的虚拟机;
不同的虚拟机在内存分配上有不同的地址空间;
这就导致了在不同的虚拟机中访问同一个类的对象会产生多份副本;
所有运行在不同进程中的四大组件, 只要它们之间需要通过内存来共享数据, 都会共享失败;
这也是多进程所带来的主要影响;
正常情况下, 四大组件中间不可能不通过一些中间层来共享数据;
多进程模式会造成如下问题:
1) 静态成员和单例模式完全失效;
2) 线程同步机制完全失效;
3)SharedPreferences 的可靠性下降;
4)Application 会多次创建;// 运行在同一个进程中的组件属于同一虚拟机和同一个 Application
===================================================
安卓系统有很多跨进程的通信方式:
1)Intent 传递数据
2) 共享文件和 SharedPreferences
3) 基于 Binder 的 Messenger 和 AIDL 以及 Socket
此外要先熟悉 Serializable 和 Parcelable 接口, 以及 Binder 的概念, 熟悉完这些基础概念之后, 再去理解 IPC 方式就比较简单了;
来源: http://www.bubuko.com/infodetail-3456656.html