Android8_安卓的IPC机制

理解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,并且签名相同;

在这种情况下,它们可以互相访问对方的私有数据。

进程名以“:”开头的进程,属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中;

进程名不以:开头的进程属于全局进程,其他应用通过ShareUID可以和它跑在同一个进程中;

android:process属性:

如果不填写的话,默认用包名;

:额外命名   表示当前进程名=包名+额外命名;是一种简写

完整的写法:包名.额外命名=进程名

==================================================

运行多进程模式

安卓为每个应用分配了一个独立的虚拟机,或者说为每个进程都分配了一个独立的虚拟机;

不同的虚拟机在内存分配上有不同的地址空间;

这就导致了在不同的虚拟机中访问同一个类的对象会产生多份副本;

所有运行在不同进程中的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败;

这也是多进程所带来的主要影响;

正常情况下,四大组件中间不可能不通过一些中间层来共享数据;

多进程模式会造成如下问题:

1)静态成员和单例模式完全失效;

2)线程同步机制完全失效;

3)SharedPreferences的可靠性下降;

4)Application会多次创建;//运行在同一个进程中的组件属于同一虚拟机和同一个Application

===================================================

安卓系统有很多跨进程的通信方式:

1)Intent传递数据

2)共享文件和SharedPreferences

3)基于Binder的Messenger和AIDL以及Socket

此外要先熟悉Serializable和Parcelable接口,以及Binder的概念,熟悉完这些基础概念之后,再去理解IPC方式就比较简单了;

原文地址:https://www.cnblogs.com/grooovvve/p/12462286.html