在 Android 中多进程指单个应用存在多个进程的情况。
开启多进程模式
在 Android 中开启多线程只有一种方法,即在 AndroidManifest.xml 中指定 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.wshunli.ipc.demo.remote" />
MainActivity 没有指定 process 属性,则运行在默认进程中,进程名为包名。
当启动 SecondActivity 或者 ThirdActivity 时,系统会为他们单独创建进程,
进程名分别为 com.wshunli.ipc.demo:remote
和 com.wshunli.ipc.demo.remote
.
对于二者的区别,
前者 com.wshunli.ipc.demo:remote
代表应用私有进程,其他应用的组件不可与其在同一进程中。
后者 com.wshunli.ipc.demo.remote
代表全局进程,其他应用可通过 ShareUID 方式与其在统一进程中。
Android 系统会为每个应用分配一个唯一的 UID ,具有相同的 UID 应用才能共享数据。
两个应用通过 ShareUID 跑在同一进程中也是有要求的,需要两个应用有相同的 ShareUID 并且签名相同。
在这种情况下,可以互相访问对方的私有数据,看起来像一个应用的两部分。
多进程模式的运行机制
Android 系统为每个应用(或者说每个进程)分配一个独立虚拟机,在内存分配上也有不同的地址空间。
我们新建一个 UserManager 类,然后写一个静态变量。
public class UserManager {
public static int wshunli = 1;
}
在 MainActivity 中将静态变量赋值为 2 ,然后在 SecondActivity 和 ThirdActivity 中打印出来,发现其值仍然是 1 。
所有运行在不同进程中的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败,这也是多进程所带来的主要影响。
一般来说,使用多进程会造成如下几方面的问题:
(1) 静态成员和单例模式完全失效(不同的虚拟机)。
(2) 线程同步机制完全失效(不是同一块内存空间)。
(3) SharePreferences 的可靠性下降(底层通过 XML 执行操作,并发读/写都有可能出问题)。
(4) Application 会多次创建(启动新进程其实就是启动一个应用的过程,自然会创建新的 Application )。
public class MApplication extends Application {
private static final String TAG = "MApplication";
@Override
public void onCreate() {
super.onCreate();
int pid = Process.myPid();
Log.d(TAG, "pid: " + pid);
}
}
同一个应用的多线程相当于不同应用采用 ShareUID 模式。
参考资料
1、《Android开发艺术探索》 -- 2.2 Android 中的多进程模式
2、Android 接口定义语言 (AIDL) | Android Developers
https://developer.android.com/guide/components/aidl
3、Android IPC机制(一)开启多进程 | 刘望舒的博客
http://liuwangshu.cn/application/ipc/1-process-start.html
评论 (0)