这篇文章主要从以下几点着手:
- 什么是IPC
- Android中进程与线程之间的关系
- 开启多进程的方法
- 多进程通信存在的问题
- Android中IPC的方式有哪些
什么是IPC
IPC是指进程间通信或者跨进程通信,即两个进程之间进行数据交换的过程。
Android中进程和线程的关系? 区别?
线程是CPU调度的最小单元,同时线程是一种有限的系统资源。而进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用。一个进程至少包含一个线程也可以包含多个线程,因此进程和线程是包含与被包含的关系。
如何开启多进程
要想开启多进程只有一种方法,那就是给四大组件(Activity、Service、Receiver、ContentProvider)在AndroidMenifest中指定android:process属性。
android:process属性命名有两种:
- android:process=":remote"
- android:process="com.test.process.remote"
“:”的含义是指要在当前的进程名前面附加上当前的包名,这是一种简写的方法,如果包名是com.test.process,那它完整的进程名为com.test.process:remote;另外一点需要注意的是:进程名以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以“:”开头的进程属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中。
那应用是否可以开启N个进程呢?
当然在内存允许的条件下可以开启N个进程
多进程通信可能会出现什么问题
为何需要IPC?
所有运行在不同进程的四大组件(Activity、Service、Receiver、ContentProvider)共享数据都会失败,这是由于Android为每个应用分配了独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这会导致在不同的虚拟机中访问同一个类的对象会产生多份副本。
多进程通信会造成如下几方面的问题
- 静态成员和单例模式完全失效:独立的虚拟机造成
- 线程同步机制完全实效:独立的虚拟机造成
- SharedPreferences的可靠性下降:这是因为Sp不支持两个进程并发进行读写,有一定几率导致数据丢失
- Application会多次创建:Android系统在创建新的进程会分配独立的虚拟机,所以这个过程其实就是启动一个应用的过程,自然也会创建新的Application
Serialzable和Parcelable的区别
首先来看下Bundle传递对象为什么需要序列化?
那是因为内存中的对象是短暂的,无法长期驻存在内存中,为了想把对象的状态保存下来,就需要将对象写到磁盘和其他介质中,而这个过程就叫做序列化 。反序列化是序列化的反向操作。
序列化:将内存中的对象存储在磁盘或者其他介质中
反序列化: 将磁盘或者其他介质中的对象写到内存中
Android中IPC方式、各种方式优缺点
Android中的IPC方式有很多种,主要是Binder和Socket,其中在Android开发中,Binder主要用在Service中,包括AIDL和Messenger,其中普通Service中的Binder不涉及进程间通信
Android中IPC方式
网友评论