本文介绍Android程序如何使用多进程,为什么要使用多进程,并说明了使用多进程可能会出现的一些问题。

1. Android程序如何使用多进程

根据Processes and Threads,默认情况下,一个Android程序的所有组件都是在一个进程中执行的,该进程的名字就是程序的包名。同时,Android也允许开发者将程序的一些组件在其他进程中执行。四大组件均支持android:process属性,我们可以设置该属性的名字,将组件运行在指定的进程。参考以下的例子,

        <activity            android:name=".SecActivity"            android:label="@string/title_activity_sec"            android:process=":secActivity" >        activity>

在该例子中,我们将SecActivity的android:process属性设置为”:secActivity”(暂时忽略“:”的意思,稍后介绍),启动程序,打开SecActivity,然后进入adb shell,执行ps命令,查看当前正在运行的进程信息,

由上图可以看到,的确由两个进程在运行,其中一个的名字是paul.example.mutliprocessdemo,这正是我们的包名,也就是说,这个就是我们的主进程。另一个的名字是paul.example.mutliprocessdemo:secActivity,这是我们在Manifest文件中设置”:secActivity”的结果。

接下来来介绍“:”的含义,如果一个组件指定的进程名是以“:”开头的,就意味着该进程是一个私有进程。那么何为私有进程?私有进程是和全局进程对应,如果我们在android:process中填写的是完整的包名,那么该进程就是一个全局进程。全局进程允许两个不同的应用(或组件)运行在同一个进程中(使用ShareUID,且签名完全一致);私有进程则不可以。

另外,Application也可以设置android:process属性,来修改所有组件运行进程的名称。

2. 为什么使用多进程

为什么Android应用要使用多进程?有以下理由,欢迎各位读者补充~
1. 更大的内存分配,我们知道,Android设备限制了每一个进程所分配的内存大小,如果这个大小是32M,那么如果我们的应用有两个进程,那么所能使用的最大内存就是32*2=64M。所以如果用户经常收到OutOfMemory异常,那么就应该考虑使用多进程。

2. 防止进程被杀死。考虑这样一种情况,一个后台进程在播放音乐,此时,内存吃紧,系统需要释放更多的内存,此时系统就会优先把UI进程给杀掉,而不是播放音乐的进程。还有另外一个应用场景,我们可以使用守护进程来保护我们的主进程不被杀死。具体的做法是主进程和守护进程相互监护,若对方被杀死,则重启。

3. 分担主进程的内存压力。现在的应用越来越大,我们可以将一些其他的工作放在额外的进程中运行,来降低主进程的压力。

3. Android多进程会带来什么问题

我们知道,在Android设备上,一个进程对应一个虚拟机实例。而不同的虚拟机之间是相互隔离的,也就意味着,我们不能使用常规方法来共享数据。

但是,这并不意味着两个进程之间无法通信。事实上,有一些方法可以实现进程间通信。比如,Intent,Handler,Messenger,AIDL或者Binder。

另外,多进程还会带来以下问题,

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

更多相关文章

  1. android 内存管理
  2. 如何开发一个适配Android和iOS双平台的React Native应用
  3. Android基本组件学习(Activity生命周期)
  4. Android中通过Messenger与Service实现进程间双向通信
  5. 浅入浅出 Android(安卓)安全:第三章 Android(安卓)本地用户空间层
  6. Android进程间通信IPC机制Binder
  7. Android-RelativeLayout布局
  8. Android(安卓)Zygote
  9. Android属性系统

随机推荐

  1. 解决Debug certificate expired的问题
  2. Android(安卓)Drawable Resources系列1:B
  3. Android与H5交互,向H5注入APP账号密码免登
  4. Android动画-概述
  5. Android继承ViewGroup自定义流式布局
  6. Android(安卓)开发之serviceManager分析
  7. Android(安卓)NDK学习笔记8-JNI的访问域
  8. Android拍照流程
  9. android输入框只能输入数字和小数点
  10. Linux下搭建Android开发环境