1.1IPC是Inter Process Communicationde的缩写,意为跨进程通信或进程间通信.
进程和线程的区别与关系:
- 进程:一般是指一个执行单元,在pc和移动设备上指一个程序或一个应用.
- 线程:是cpu调度的最小单元,同时线程是有限的系统资源.
- 一个进程可以包含多个线程,因此进程和线程之间是包含和被包含之间的关系.
1.2如何开启多进程?
在Android中多进程是指一个应用中包含多个进程的情况.在Android中使用多进程的方式只有一种,即在manifest中给四大组件指定android:process属性(默认进程的名字是包名),别无他法.也就是说我们无法给一个线程或者某个实体类指定其运行时所在的进程.其实还有一种非常规的方法,那就是通过JNI在native层去fork一个新的进程,但这种方法属于特殊情况,也不是常用的创建多进程的方法.
在manifest中的四大组件具体写法如下::
a.android:process=”:remote”.用冒号”:”拼接字符串
b.android:process=”com.abc.test.remote”.写上完整的进程名称
区别:
a中的”:”代表在当前的进程前附加上当前的包名,这是一中简写的方式,另外,用冒号拼接的进程代表的是当前应用的私有进程,其他应用的组建不可以和它跑在同一进程中;
b中的进程是完整的命名方式,也是全局的进程,其他应用可以通过shareUID方式和它跑在同一进程.
注:在Android中,系统会为每个应用分配一个唯一的UID,只有相同的UID才能共享数据.这里需要注意的是,俩个应用通过shareUID跑在同一进程是有要求的,需要俩个应用有相同的ShareUID,并且签名相同.在这种情况下,可以相互访问对方的私有数据,如data目录,组建信息等.如果俩个应用跑在同一进程,不仅可以共享私有数据,还可以共享内存中的数据.就像是同一应用的俩个不同部分.
同一个应用中,所有运行在不同进程的四大组件,都不能通过内存来共享数据,多进程处理不当常见的影响如下:
- 静态成员和单例模式完全失效;
- 线程同步机制完全失效;
- SharePregerences可靠性降低;
- Application会多次创建;
1,2的原因:每个进程对应的都是独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致了不同的虚拟机访问同一个类的对象会产生多个副本,各副本间的类对象是独立的,由此导致1.2问题;SharePregerences不支持多个进程同时执行读写操作,否则有一定几率导致数据丢失,故可靠性会降低.由于系统在创建新的进程时,需要分配独立的虚拟机,这个过程就是启动一个应用的过程,因此自然会创建新的application.