Android多进程使用及其带来的问题

注:Android进程挂了,不会影响到另一个已经开启的进程。

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

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

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

        <activity
            android:name=".SecActivity"
            android:label="@string/title_activity_sec"
            android:process=":secActivity" >
        </activity>
  • 1
  • 2
  • 3
  • 4
  • 5

在该例子中,我们将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中。

猜你喜欢

转载自blog.csdn.net/u011368551/article/details/81516673
今日推荐