阅读的书籍:《Android开发艺术探索》
关键词:Android IPC简介,Android中的多进程模式
Android IPC简介:IPC是Inter-Process Communication 的缩写,也叫做进程间通信或者跨进程通信
进程间通信是指两个进程之间进行数据交换的过程,它不是Android独有的,任何一个操作系统都需要有响应的IPC机制
在 Android中最有特色的进程间通信方式就是Binder了,当然Android也支持Socket
IPC的使用场景:面对多进程时
多进程的情况分为两种:
- 一个应用因为某些原因自身需要采用多进程模式来实现
- 当前应用需要向其他应用获取数据,由于是两个应用,就必须跨进程获取所需的数据
Android中的多进程模式:通过为四大组件指定android:process属性,可以开启多进程模式
开启多进程模式
举个例子:
:remote 是一种简写的方式,这里 “ :”的含义是指在当前的进程名前面附加上当前的包名
com.ryg.chapter_2.remote 则是一种完整的命名方式,不会再附加包名信息
- 进程名以 “ :”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,
- 进程名不以 “ :”开头的进程则属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中
- 当SecondActivity启动时,系统会为它创建一个单独的进程,进程名为 "com.ryg.chapter_2:remote"
- 当ThirdActivity启动时,系统也会为它创建一个单独的进程,进程名为 "com.ryg.chapter_2.remote"
补充:Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据
多进程模式的运行机制
Android为每一个进程都分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,导致在不同的虚拟机中访问同一个类的对象会产生多份副本。
案例:
SecondActivity运行在独立的进程中,新建一个UserManager类:
在MainActivity的 onCreate中把sUserId改为2,然后SecondActivity打印sUserId的值,但结果仍然是1,而不是2
原因:在一个进程中修改sUserId的值只会影响当前进程,对其他进程不会造成任何影响
得出的结论:
所有运行在不同进程中的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败
多进程会造成如下几个方面的问题:
- 静态成员和单例模式完全失效
- 线程同步机制完全失效
- SharedPreferences的可靠性下降
- Application会多次创建
SharedPreferences不支持两个进程同时去执行写操作,因为这会导致并发读写XML文件发生一定几率的数据丢失
在多进程模式中,不同进程的组件会拥有独立的虚拟机,Application以及内存空间
结尾:在多进程中虽然说不能直接地共享内存,但还是可以通过跨进程通信的方式实现数据交互