理解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方式就比较简单了;