一.IPC简介
1.IPC:是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。
2.线程:是CPU调度的最小单元,同时线程是一种有限的系统资源
3.进程:是指一个执行单元,在PC和移动设备上是指一个程序或者一个应用,一个进程可以包含多个线程,因此进程和线程是包含与被包含的关系。
4.Android里面的主线程,也称为UI线程,在UI线程里才能操作界面元素,一个进程需要执行大量的耗时任务,这些耗时任务如果放在主线程中去执行,严重影响用户体验,还可能造成应用无响应(ANR),解决这个问题就需要用到线程,把一些耗时的任务单独放到子线程中执行。
5.ANR:Application Not Responding,ANR一般有三种类型:
(1). KeyDispatchTimeout(5 seconds) --主要类型按键或触摸事件在5秒内无响应
(2). BroadcastTimeout(10 seconds) --BroadcastReceiver在10秒内无法处理完成
(3). ServiceTimeout(20 seconds) --小概率类型 Service在20秒内无法处理完成
6.IPC的使用场景:只有面对多进程时,才需要考虑进程间通信,多进程的情况分为两种:
(1).一个应用因为某些原因自身需要采用多进程模式来实现,比如:有些模块需要运行在单独的进程中,又或者是为了增大一个应用可使用的内存所以需要多进程来获取多份内存空间。
(2).一个应用需要向其它应用获取数据,由于是两个应用,所以必须采用跨进程的方式来获取所需的数据,比如:通过ContentProvider对通讯录的增删改查。
二.Android中的多进程模式
1.Android中的多进程是指一个应用中存在多个进程的,在Android中使用多进程的方法有且只有一种:就是给四大组件(Activity,Service,Receiver,ContentProvider),在AndroidManifest中指定android:process属性,Android默认进程名是包名。
2.process属性的定义分为两种
(1).android:process="com.xxx.xxxx.remote" 完整的命名方式,属于全局进程,其它应用通过ShareUID方式可以和它跑在同一个进程中。
(2).android:process=":remote",进程以“:”开头的进程属于当前应用的私有进程,其它应用的组件不可以和它跑在同一个进程中,“:”命名的进程会在当前的进程名之前附加上包名如:“com.xxx.xxxx:remote”。
3.UID:Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据。如果两个应用通过ShareUID跑在同一个进程中,需要两个应用具有相同的shareUID并且相同的签名才可以。
4.多进程带来的问题
(1).静态成员和单例模式完全失效
(2).线程同步机制完全失效
(3).SharedPreference的可靠性下降
(4).Application会多次创建
所以说:运行在不同进程中的四大组件,只要他们之间通过内存来共享数据,都会失败。正常情况下四大组件共享数据必须要通过一些中间层。系统提供了很多跨进程通信的方法:(Intent传递数据,文件共享,Messenger,AIDL,ContentProvider,Socket等)。
后续会详细分析各种跨进程通信的方式,请持续关注;