IPC

这篇文章主要从以下几点着手:

  • 什么是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传递对象为什么需要序列化?

那是因为内存中的对象是短暂的,无法长期驻存在内存中,为了想把对象的状态保存下来,就需要将对象写到磁盘和其他介质中,而这个过程就叫做序列化 。反序列化是序列化的反向操作。

序列化:将内存中的对象存储在磁盘或者其他介质中
反序列化: 将磁盘或者其他介质中的对象写到内存中

Serialzable和Parcelable的区别

Android中IPC方式、各种方式优缺点

Android中的IPC方式有很多种,主要是Binder和Socket,其中在Android开发中,Binder主要用在Service中,包括AIDL和Messenger,其中普通Service中的Binder不涉及进程间通信

Android中IPC方式

推荐阅读更多精彩内容