IPC 是Inter-Process-Communication 的缩写,含义为进程间通讯或者跨进程通信,是指两个进程间进行数据交换的过程。
理解两个概念 线程 是CPU调度的最小单元,同时线程也是一种有限的系统资源 。
进程一般是指一个执行单元,在pc端或者移动端对应表示一个程序或者一个应用。
进程和线程的关系 一个进程可以包含多个线程。一个进程可以只有一个线程,即主线程。如果在主线程进行耗时操作 会造成界面 无响应,在pc系统和移动系统中都存在,在android出现这种情况 名字叫做ANR(Application Not Responding) ,即应用无响应 android是主线程阻塞5s就会出现这种情况。 解决办法就是用子线程去进行耗时操作。
任何 一种系统都需要用到IPC机制
Android 是基于Linux 内核的移动操作系统,但是并不能完全继承Linux的进程通信方式,android 有特色的进程通信方式是Binder,通过BInder可以轻松实现跨进程通信,同事android 还支持Socket进行跨进程通信。
为啥需要跨进程通讯?
1,由于应用的某些特殊要求,一些模块必须运行在单独的进程中
2.为了加大一个应用的可使用内存空间,默认一个进程可以得到系统固定的内存 一般默认为16MB
3.一个应用为另一个应用提供数据。 常用ContentProvider 也是一种跨进程方式。
多进程模式
在AndroidMenifest中为四大组件 Android:precess属性就可以开启一个进程。(这些组件要被调用启动之后才行)
通过adb shell "ps | grep 包名" 可以查看一个包名下的进程信息。
:会在前面加上包名做为进程的名字 标识当前应用的私有进程
别的标识命名方式进程属于全局进程 可以通过ShareUID的方式 和他跑在同一个进程中。 需要相同的ShareUID和签名才行
android为每一个进程分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,不同的虚拟机访问同一个类的对象会产生多个副本。就是两个互不干扰的两个类。
多进程产生的问题
1. 静态成员和单例模式失效 静态成员和单例模式都是用的内存 不同进程 用的内存不一样所以失效
2.线程同步机制完全失效 不是一块内存了,对象属于的内存不一样,锁对象和锁全局类都无法保证同步,锁的对象不是同一个对象
3.SharePreference 可靠性下降 不同进程操作可能会出现同时操作问题,不支持并发读写。
4.Application 会重复创建,一个组件跑在一个新的进程中,系统要创建新的进程同时分配新的虚拟机,这就相当于启动一个应用过程,会创建新的application 。
不同的进程会有独立的虚拟机,application 和内存空间, 同一个应用的多进程,就相当于两个不同的应用用了相同的ShareUId模式。