Android中的多进程

Android中的多进程

Android中的多进程模式

Android中开启多进程的方式:
1.给四大组件在AndroidManifest中指定android:process属性
2.通过JNI在native层去fork一个新的进程

  但是第二种方法属于特殊情况,也不是常用的创建多进程方式,因此暂时只考虑第一种方法。
下面是一个示例,描述如何创建多进程:

    <activity android:name=".ipc.FirstActivity">
        <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity android:name=".ipc.SecondActivity"
        android:process=":second"/>
    <activity android:name=".ipc.ThirdActivity"
        android:process=".third"/>

  上面示例分别为SecondActivity和ThirdActivity制定process属性。当3个activity都启动时,在DDMS视图中查看进程信息,SecondActivity和ThirdActivity对应的进程名称分别为“com.gyh.kotlintest:second”和“.third”。

图1

  不知道大家注意到没,在SecondActivity中命名的是”:second”,在DDMS中显示时进程名前面却附上了包名,而ThirdActivity则没有变化。其实这两种命名方法是有区别的,在于两方面:其一,“:”的含义是指在进程名前面附上包名,对于SecondActivity而言,其完整的进程名就是“com.gyh.kotlintest:second”;其二,进程名以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和他跑在同一个进程中,而不以“:”开头的进程为全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中。

多进程的弊端

使用多进程一般会造成以下几个方面的问题:

  1. 静态成员和单例模式完全失效
  2. 线程同步机制完全失效
  3. SharePresences的可靠性降低
  4. Application会多次创建

  现在我们一个一个来分析。针对第1个问题,我们先来看一个例子:
在GrobalData中定义一个静态变量public static int grobal = 0,在FirstActivity中进行GrobalData.grobal++操作,并在SecondActivity中打印grobal的值。结果发现在SecondActivity中,grobal的值还是0,并不是进行GrobalData.grobal++操作后应有的值1。

图2

原来Android会为每一个进程都分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致了在不同虚拟机中访问同一个类的对象会产生多分副本。所以在这个例子中,进程“com.gyh.kotlintest”和进程“com.gyh.kotlintest:second”都存在一个GrobalData类,并且互不干扰,这就解释了明明在FirstActivity中修改了grobal 的值,在SecondActivity中却没改变的现象。同时也解释了造成第1个问题的原因。
  第2个问题本质上和第1个问题类似,不管锁对象还是锁全局类都无法保证线程的同步,因为不同进程锁的不是同一个对象。
  第3个问题是因为SharePresences不支持两个进程同时去执行写操作,否则可能会造成数据丢失。
  第4个问题也显而易见,当一个组件跑在一个新的进程中时,由于系统要在创建进程的同时分配独立的虚拟机,这个过程其实也就是启动一个应用的过程。因此,相当于系统又把这个应用启动了一遍,那么自然就会创建新的 Application。

  这里分析了多进程所带来的问题,为了解决这些问题,系统提供了许多跨进程通信的方法,如通过Intent传递数据,共享文件和SharePresences,基于Binder的Messenger和AIDL以及Socket等。虽然不能直接共享内存,但是通过跨进程通信我们还是可以实现数据交互的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值