Android IPC【Inter-Process Communication】机制二【Android 中的多进程模式】

使用多进程的情况分为两种可能:

1:一个应用因为某些原因自身需要运行在独立的进程中,又或者为了加大一个应用可使用的内存所以需要通过多进程来获取多份内存空间。

2:当前应用需要向其他应用获取数据,由于是两个应用,所以必须要采用跨进程的方式去获取需要的数据,甚至我们通过系统的ContentProvider去查询数据的时候,其实也是一种进程间通信,只不过通信细节被系统内部给屏蔽 了,无法感知。

一:开启多进程模式

 在android中使用多进程只有一个方法,就是为四大租件在androidMenfiest中知指定android:process 属性,除此之外别无他法。。。除了另一种非常规的多进程方法,就是通过JNI在底层去fork一个新的进程,该方法属于特殊情况,非常见情况。。。本章不考虑该情况,需要了解,请自行查询资料

 xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xyz.project">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <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=".Main2Activity"
            android:process=":remote" />
        <activity
            android:name=".Main3Activity"
            android:process="com.xyz.project.test"></activity>
    </application>

</manifest>

xml中的三个activity中
MainActivity:没有为其指定进程,那么就会运行在应用默认的进程中,默认的进程名字和app的包名是一样的。
Main2Activity:这个activity的process属性就特殊一点了, 以‘:进程名称’的方式进行命名,和Main3Activity 的 com.xyz.project.test 完整命名方式有什么区别呢?
其实也没什么区别。。那是不可能的
第一个区别: 以 ':进程名称' 的方式命名的话代表 在当前进程名前面附加上当前的包名 最终的进程名称就是 com.xyz.project.remote ,其实这只是一种缩写的方式,然并卵,但是需要了解下,万一哪个畜生就是这么写的,到时候一脸懵逼就不好了。。。
第二个区别: 以':进程名称' 的命名的进程的 表示是当前应用的私有进程,其它应用的组件不可以和他跑在同一个进程中,而进程名不以':'开头的进程属于全局进程,其它应用通过ShareID【android系统会为每一个应用分配一个唯一的UID,具有相同的UID应用才可以共享数据】方式可以和他跑着同一个进程中

最终运行的结果可以在android studio的监视器窗口进行查看:

二:多进程模式的运行机制

讲多进程模式的运行机制之前,我们先讲下,多进程带来的困扰
困扰:

1:静态成员和单例模式的失效

首先我举个例子:
应用中有一个静态成员变量
public static int staticMember=0;
我们在MainActivity 中设置staticMember=1,然后在Main2Activity获取静态成员staticMember值会是1吗?当然不是,WHY ,这是为什么呢。。
这就是多进程的运行机制了,一个应用中的每一个进程都是运行在独立的虚拟机上的,也就是拥有独立的内存。进程之间不采取手段的话,是不可以共享内存数据的。当前是没有采取手段的,那么Main2Activiy访问的变量其实就是静态成员变量的初始副本值,也就是默认值0.或者说,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本

通过静态成员变量的例子,也就得以知道了单例模式的失效原因,那是因为单例模式是在当前单例实例化进程中有限的。

2:线程同步机制完全丧失
在这里我们讲下线程和进程的概念关系
(1):线程
 是cpu调度的最小单元,是一种有限的资源。
2):进程
指一个执行单元,在pc和移动设备中指一个程序或者一个应用或一个进程
二者之间的关系为进程包括线程,线程只生存在他运行所处的进程中。

线程同步机制丧失也是因为不同进程锁的不是同一个对象,或者不是同一个全局类,由进程的运行机制可以看出,独立的虚拟机,独立的内存。。。
3:SharedPreferences的可靠性下降
因为 SharedPreferences 不支持两个进程同时去执行读写操作,否者会导致一定几率的数据丢失,这是因为它的底层是通过读写xml文件来实现的,并发读写有可能会出问题
4:Application的多次创建
当一个组件跑在一个新的进程中的时候,由于系统要在创建新的进程的同时分配独立的虚拟机,所以这个过程其实就是一个启动应用的过程。相当于应用重新启动了下,重新启动的话,自然就会重新创建Application
多进程的运行机制一句话总结就是,每一个进程是运行在独立的虚拟机和拥有独立的内存。多进程模式中,不同进程的组件会拥有独立的虚拟机,Application以及内存空间,当然这会给实际开发带来困扰,
有困扰就退缩了吗,我是这样的,但是我们的google不是这样的。。。
android系统提供了很多的跨进程通信的方法,虽然不可以直接的共享内存,但是通过通信我们还是可以实现数据交换的。实现跨进程通信的方式有很多种,除了有四大组件的方式还有共享文件,SharedPreferences,基于Binder 的Messenger和AIDL以及Scoket等。。。后续文章将会讲解到,下回分解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值