Android中的多进程模式
开启多进程模式
- 通常情况下,在Android中的多进程指的是一个应用存在多个进程,而不是指的是两个应用之间的多进程通信。
- 在Android中使用多进程只有一种方法,就是给四大组件(Activity、Service、Receiver、ContentProvider)在AndroidManifest中指定
android:process
属性,也就是说无法给一个线程或者一个实体类指定其运行时所在线程。Ps:其实还有一种非常规方法,那就是通过JNI(Java Native Interface)在native层去fork一个新的进程。
<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=".SecondActivity"
android:process=":remote"/>
<activity android:name=".ThirdActivity"
android:process="com.example.ricco.myapplication.remote" />
</application>
上方代码和图片分别描述了如何在Android中创建多进程,其中MainActivity没有指定android:process
属性,那么它运行在默认进程中,默认进程名为包名。而另外两个分别指定了“:remote
”和“com.example.ricco.myapplication.remote
”,首先,“:”的含义是==指要在当前进程名前面附加上当前的包名==,而对于ThirdActivity中的声明方式,它是一种完整的命名方式,不会附加包名信息;其次,进程名以“:”开头的进程属于当前应用的私有进程,其他应用组件不可以和它跑在同一个进程中,而其他进程属于全局进程,其他应用通过ShareUID方式可以和它跑在同一进程中。
- Android会为每个应用分配一个唯一的UID,具有相同UID的应用才能共享数据。两个应用通过ShareUID跑在同一个进程中时,需要这两个应用有相同的ShareUID并且签名相同才可以。在这种情况下,不管它们是否跑在同一个进程中,它们可以互相访问对方的私有数据(data目录,组件信息等),如果它们跑在同一进程中,还可以共享内存数据,或者说它们看起来像是一个应用的两个部分。==其实可以这样理解同一个应用间的多进程:它就相当于两个不同的应用采用了ShareUID的模式==
多进程模式的运行机制
- Android会为每一个应用分配了一个独立的虚拟机,或者说为每个进程都分配一个独立的虚拟机,不同虚拟机在内存分配上有不同的地址空间。
- 一般来说使用多进程会造成如下几方面的问题:
- 静态成员和单例模式完全失效
- 线程同步机制完全失效
- SharePreference的可靠性下降(SharePreference底层是通过读/写XML文件来实现的,并发读写可能会出现问题)
- Application会多次创建(运行在同一个进程中的组件属于同一个虚拟机和同一个Application,所以运行在不同进程中组件是属于两个不同的虚拟机和Application的)