多进程模式的运行机制
Android为每个应用或者说每个进程都分配了一个独立的虚拟机,不同虚拟机在内存分配上有不同的地址空间,导致不同的虚拟机访问同一个类的对象会产生多份副本。例如不同进程的Activity对静态变量的修改,对其他进程不会造成任何影响。
所有运行在不同进程的四大组件,只要它们之间需要通过内存在共享数据,都会共享失败。运行在不同进程下的四大组件之间不可能不通过中间层来共享数据。
多进程会带来以下问题:
- 静态成员和单例模式完全失效。
- 线程同步锁机制完全失效。
- SharedPreferences的可靠性下降。
- Application会多次创建。
前两点都是因为不同进程不在同一个内存空间下,锁的对象也不是同一个对象。
SharedPreferences不支持两个进程同时去执行写操作,否则会导致一定机率的数据丢失,这是因为SharedPreferences底层是通过读/写XML文件实现的,并发写显然会出现一些问题,甚至并发读/写都会出现问题。
由于系统创建新的进程的同时分配独立虚拟机,其实这就是启动一个应用的过程,启动一个应用肯定会创建一个新的Application。
在多进程模式中,不同进程的组件拥有独立的虚拟机、Application以及内存空间。
运行在不同进程下的组件之间如果要共享数据的话,就要进行跨进程通信,Android实现跨进程通信的方式有很多:
- Intent传递数据。
- 共享文件和SharedPreferences。
- 基于Binder的Messenger和AIDL。
- Socket。
总结自:《Android开发艺术探索》