Android中的多进程模式
采取多进程的使用场景
- 应用应自身需要需采用多进程
- 有些模块因特殊原因需运行在单独进程
- 为了加大一个应用可使用的内存,使用多进程来获取多份内存空间
- Android对单个应用的最大内存做了限制,早期的为16M,不同设备大小不同
- 调用系统或第三方平台应用。由于是两个进程,所以必须使用跨进程的方式
开启多进程模式
创建新的进程,在多进程模式中,不同进程的组件会拥有独立的虚拟机,Application以及内存空间。它就相当于两个不同应用采用了sharedUID模式。
方式一
以此方式,进程名为包名:remote。属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中。
android:process=":remote"
方式二
以此方式,进程名为com.ethanco.test.remote。属于全局进程,其他应用通过ShareUID方式可以和它跑在同一进程中。
android:process="com.ethanco.test.remote"
Android系统会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据。
在ShareUID和签名都相同的情况下,可以互相访问对方的私有数据。
如果连进程又相同,还可以共享内存数据。
方法三
通过JNI在native层去fork一个新的进程
使用多进程会造成
- 静态变量和单例模式完全失效
- Android为每个进程都分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,导致不同的虚拟机访问同一个类的对象会产生多份副本。
- 线程同步机制完全失效
- 因为不是同一块内存,那么不管是锁对象还是锁全局类都无法保证线程同步
- SharedPreferences的可靠性下降
- SharedPreferences不支持两个进程同时去执行写操作,否则会导致一定几率的数据丢失。
- SharedPreferences底层是通过读/写XML文件来实现的
- Application会多次创建
- 当一个组件跑在一个新的进程中的时候,由于系统要在创建新的进程同时分配独立的虚拟机,所以这个过程其实就是启动一个应用的过程。因此,相当于系统又把这个应用重新启动一遍。
在多进程情况下,防止Application多次创建
可在Application#onCreate()中判断进程名,只有主进程继续执行
@Override
public void onCreate() {
super.onCreate();
//多进程,防止除主进程外的初始化
String processname = RunTimeUtil.getCurProcessName(this);
if (!"cn.nbhope.threepartprotocol".equals(processname)) return;
//do something
}
其他
参考 《Android艺术开发探索》