IPC也就是Inter-Process Communication,含义是进程通信,是指两个进程之间进行数据交换的过程。
什么是线程?什么是进程?
线程是CUP调度的最小单元,是一种有限的系统资源,进程一般指一个执行单元,在PC或者移动端上一般指一个程序或者应用。进程与线程是包含关系。一个进程可以包含多个线程,但最低要有一条线程。即主线程(Android中的UI线程),很多时候,如果主线程执行大量耗时任务,就会造成界面无响应,Android 一般主线程阻塞超过5秒,则会报ANR异常。也就是应用无响应。
在任何操作系都中都需要有对应的IPC机制。
Android中IPC使用的场景基本有以下几种。
1,有些模块特殊需要放在单独进程的。
2,通过多进程获取多份内存空间。(Android对单个应用所使用的最大内存做了限制)
3,当前应用需要向其他应用获取数据。
Android中的多进程
四大组件在配置文件中(AndroidManifest.XML)中配置android:process属性,属性值就是进程的名字,其中以:开头的含义是指要在当前线程名头上加上包名。其次以:开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一进程。不以:开头的进程属于全局进程,其他应用都可以通过ShareUID和它跑在同一进程。
多进程模式的运行机制
Android为每一个进程都分配了一个独立的虚拟机,不同的虚拟机在内存空间中的地址也不相同。导致同一个类多个进程访问,取得的数据不同。不同进程对静态变量的修改,对其他进程无效。
所有运行在不同进程的四大组件,只要通过内存进行共享数据,都会失败。
多进程带来了以下问题
1,静态成员和单例模式完全失效。
2,线程同步锁机制失效。这两点都要求在同一内存下,锁的也不是同一个对象。
3,SharedPreferences可靠性下降。底层通过读写XML文件实现,并发读写会一定几率导致数据丢失。
4,Application会多次创建,由于系统创建新的进程的同时分配独立虚拟机,其实也就是启动的过程。
在多进程中,不同的组件拥有独立的内存空间和虚拟机。
实现跨进程传递数据方法有很多
1,Intent传递数据。
2,共享文件和SharedPreferences(所有本地读写的方法 SQLite也可以)
3,基于Binder的Messenger和AIDL.
4,Socket