什么样的情况下能用得到IPC?
- IPC是Inter-Process Communication的缩写。含义为进程间通信或者跨进程通信。
- 在Windows中通过剪贴板、管道、邮槽等来进行跨进程通信,Linux上通过命名管道、共享内容、信号量等来进行进程间通信。对于Android来讲,有自己独有的跨进程通信的方式。比如Binder、Socket、Bundle、文件共享、Messenger、AIDL等等。Android中,一个应用程序默认就是一个进程。Android为每一个应用分配一个独立的虚拟机。进程彼此之间不可见,数据无法共享。下面讨论的是同一个应用中多个进程的情况。
- 开启多进程模式的方法
- 用C语言在fork出一个新的进程
- 四大组件在清单文件中设置android:process属性。如果不设置就是在默认进程中,名字是com.a.b(假如说包名是com.a.b)。如果设置了android:process=”:remote”属性,就是com.a.b:remote这个进程中,如果设置了android:process=”com.a.b.remote”属性,就是在com.a.b.remote这个进程中,每一个进程都有自己的Pid(一个数字)。
- com.a.b.remote和com.a.b:remote的区别是,前者是一个全局的进程,其他应用可以通过ShareUID方式和它运行在一个进程里面,后者是一个私有进程,其他应用的组件不能运行在这个进程里面。“:”是一种简写,代表当前包名。两个应用通过SharedUID方式运行在一个地方是有条件限制的。Android系统会为每一个应用分配一个唯一的UID,只有两个应用有相同的UID并且签名相同才可以(这还是两个应用吗,表示不理解?),这会他们就能访问对方内存数据。
- 由于是两个进程,在两个内存区域里面,无法通过内存区域进行数据共享。
- 单例模式和静态成员失效
- 线程同步机制失效(锁对象和锁全局类都不行,不是同一片内存)
- sharedpreference无法保证可靠性
- Application会多次创建 (一个新的组件与想在一个新的进程中,相当于启动了一个新的应用【把当前应用的application重新走一次】)。