使用多进程的情况分为两种可能:
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和移动设备中指一个程序或者一个应用或一个进程
二者之间的关系为进程包括线程,线程只生存在他运行所处的进程中。
是cpu调度的最小单元,是一种有限的资源。
(2):进程
指一个执行单元,在pc和移动设备中指一个程序或者一个应用或一个进程
二者之间的关系为进程包括线程,线程只生存在他运行所处的进程中。
线程同步机制丧失也是因为不同进程锁的不是同一个对象,或者不是同一个全局类,由进程的运行机制可以看出,独立的虚拟机,独立的内存。。。
3:SharedPreferences的可靠性下降
因为
SharedPreferences 不支持两个进程同时去执行读写操作,否者会导致一定几率的数据丢失,这是因为它的底层是通过读写xml文件来实现的,并发读写有可能会出问题