android开发艺术探索之--IPC(跨进程通信)---多进程模式

本文是读过 android开发艺术探索后,用于记录知识的 再次感谢任玉刚大神出这本书。

说到IPC的使用场景就必须提到多进程,只有面对多进程这种场景下,才需要考虑进程间通信。这个是很好理解的,如果只有一个进程在运行,有何谈多进程呢?多进程的情况分为两种。第一种情况是一个应用因为某些原因自身需要采用多进程模式来实现,至于原因,可能有很多,比如有些模块由于特殊原因需要运行在单独的进程中,又或者为了加大一个应用可使用的内存所以需要通过多个进程来获取多份内存空间。android对单个应用所使用的最大内存做的限制,早期的一些版本可能是16mb,不同设备有不同的大小,另一种情况是当前应用需要向其他应用获取数据,由于是两个应用,所以必须采用跨进程的方式来获取所需要的数据,甚至我们通过系统提供的contentprovider去查询数据的时候,其实也是一种进程间通信,只不过通信细节被系统内部屏蔽了,我们无法感知而已,说了这么多让我们来看看什么是android的多进程模式吧

android中的多进程模式

其实,给android的四大逐渐指定android:process属性,我们可以轻易地开启多进程模式,这看起来很简单,但是实际使用过程中去暗藏杀机,多进程远远没有沃恩想的那么简单,有时候我们通过多进程得到的好处设置都不足以弥补使用多进程所带来的代码成眠的负面影响。下面会详细分析这些问题。

  开启多进程模式

   正常情况下,在Android中多进程是指一个应用中存在多个进程的情况,因此这里不讨论两个应用之间的多进程情况,首先,在android中使用多进程只有一种方法,那就是给四大组件(activity,service,receiver,contentprovider)在androidmenifest中指定android:process属性,除此之外没有其他办法

   <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SecondActivity"
            android:process=":remote"/>
        <activity android:name=".ThirdActivity"
            android:process="com.dzx.androiddemo.remote">
        </activity>

上面代码中我在secondActivity和ThirdActivity中加入了android:process属性,并且他们的属性值不同,这意味着当前应用又增加了两个新进程。因为当前应用的包名是com.dzx.androiddemo,当secondActivity启动时,系统会为了创建一个名称为com.dzx.androiddemo:remote的进程,同理ThirdActivity启动时,会创建一个名称为com.dzx.androiddemo.remote的进程,因为mainactivity中没有process属性,所以mainactivity启动时在默认进程中启动,名称一般为包名,接下来我们启动这三个进程,然后打印log如下:

如上图所示,所有进程都被开启了。

多进程存在很多坑

  我们举个例子,我们新建一个类UserManager,这个类中有一个pubic的静态变量,

  然后在mainactivity的oncreate中我们把这个userid重新赋值为2,打印这个静态变量的值后再启动secondactivity,然后在secondactivity中在打印一下suerid的值。按照正常的逻辑,静态变量时可以在所有的地方共享的,并且一处修改处处同步,但是我们打印后发现,在secondActivity中打印的数值依然是1,这是为什么呢,我们知道android为每一个应用分配了一个独立的虚拟机,或者说为每个进程都分配了一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本。拿我们这个例子来说,在进程com.dzx.androiddemo和进程com.dzx.androiddemo:remote中都存在一个userManager类,并且这两个类是互不干扰的,在一个进程中修改userid的值只会影响当前进程,对其他进程不会造成任何影响,所以这样我们就理解了,一般来说,使用多进程会造成如下几方面问题:

     1.静态成员和单例模式完全失效

     2.线程同步机制完全失效

     3.sharedpreferences的可靠性下降

     4.application会多次创建

猜你喜欢

转载自blog.csdn.net/qq_35893839/article/details/81704477