Android多进程模式

本文内容基于《Android开发艺术探索》,强烈推荐,值得一看。

在Android中说多进程一般是指一个应用中存在多个进程,在Android中使用多进程只有一种方法:给四大组件在AndroidMenifest中指定android:process属性,除此之外别无他法(通过JNI在native层去fork一个进程也可以,不常用,不做介绍),所以我们不能给一个线程或者实体类指定其运行时所在的进程。

1.开启多进程




1). 上面三个Activity中:
  • ActivityA:未指明android:process属性,它允许在默认进程中,进程名为包名,即com.zhong;
  • ActivityB:设置android:process=":remote",系统会为它创建一个单独的进程,进程名为包名+:remote,即com.zhong:remote,相当于android:process="com.zhong:remote";
  • ActivityC:设置android:process="com.zhong.remote",系统会为它创建一个单独的进程,进程名为process设置的值,即com.zhong.remote
2). ":remote"和"com.zhong.remote"区别

":remote"中":"是指要在当前进程名前面附近包名的简写,"com.zhong.remote"是一种完整的写法,进程名不会再附加包名;其次,":"是属于当前应用的私有进程,"com.zhong.remote"是全局进程,全局进程其他应用可以通过ShareUID方式跑在同一进程中(前提是两个应用ShareUID相同并且签名相同),这两个应用可以相互访问对方私有数据。

2.运行机制

由于Android为每个进程分配独立的虚拟机,所以不同虚拟机访问同一个类会产生不同的副本,因此运行在不同进程中的组件无法通过内存共享数据,所以一个应用使用多进程会出现一下几个问题:

  • 静态成员和单例模式完全失效(不是同一块内存,会产生不同的副本)
  • 线程同步机制完全失效(不是同一块内存,所以对象也不是同一个,因此类锁、对象锁也不是同一个,不能保证线程同步)
  • SharedPreferences 可靠性下降(SharedPreferences不支持多个进程同时写,会有一定的几率丢失数据)
  • Application 多次创建(Android为每个进程分配独立的虚拟机,这个过程其实就是启动一个应用,所以Application会被创建多次)

小结: Android中使用多进程一般是来分担主进程的内存压力,应用越做越大,需要的内存也越来越多,讲一些独立的组件放在不同的进程中,这样可以减轻主进程的内存负担;还有就是启动一个Service,做一些守护或者耗时的操作。
本来想写一下Binder机制的,但现在自己还没完全搞懂,以后补上下面几篇文章会写一下IPC方式:Messenger、AIDL、ContentProvider以及Binder连接池的使用,至于文件、Socket我感觉不适很常用就不再做说明了

本人技术有限,欢迎指正,谢谢!

你可能感兴趣的:(Android多进程模式)