1. 什么是进程?
进程是操作系统分配资源(如 CPU、内存等)的基本单位。简单来说,进程是一个正在执行的程序的实例。每个进程都有自己的内存空间、数据栈和其他辅助数据,用于跟踪进程的执行状态。在 Android 中,每个应用程序通常运行在自己的进程中,这种隔离性确保了一个应用的崩溃不会直接影响到其他应用。
2. 开启多进程的方式
在 Android 中,开启多进程的方式主要通过在 AndroidManifest.xml 文件中为四大组件(Activity、Service、BroadcastReceiver、ContentProvider)指定 android:process
属性来实现。这个属性允许开发者指定组件在哪个进程中运行,从而实现多进程的功能。
以下是一个简单的示例,展示了如何在Android中 创建多进程:
<activity
android:name=".MainActivity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ThirdActivity"
android:exported="false"
android:process="com.ex.binder1.remote" />
<activity
android:name=".SecondActivity"
android:exported="false"
android:process=":remote" />
在上面的代码中,我们为 SecondActivity
和 ThirdActivity
使用了process属性分别指定了不同的进程。具体来说:
- SecondActivity 的进程名为
xxx.xxx.xxx:remote
,其中xxx.xxx.xxx
是应用的包名。 - ThirdActivity 的进程名为
com.ex.binder1.remote
,这是另一种完整的说明方式,不会附加包名。
同时MainActivity没有为他指定process属性,那么它运行在默认进程中,默认进程的进程名是包名。
进程命名规则
- 进程名以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程当中。
- 不以“:”开头的进程属于全局进程,其他应用通过shareUID方式可以和它跑在同一个进程中。
3.查看多进程的方式
1.通过Android Studio的Log控制台查看
2.adb命令查看
adb shell ps | findstr com.ex.binder1(自己的包名)
4.多进程的进程隔离问题
在进程A定义一个变量,然后进行重新赋值,然后我们在进程B拿到这个变量打印出来看一下效果,会发现进程B的变量是没有被修改过的,这就很有意思了,这就是我们说的进程隔离。
产生进程隔离的原因?
我们知道Android为每一个应用分配了一个独立的虚拟机,或者说为每一个进程都分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本。所以修改进程A的变量不会影响到进程B的变量。
一般来说,进程隔离会造成如下几方面的问题:
(1)静态成员和单例模式完全失效。原因:不同进程访问的不是同一个对象了。
(2)线程同步机制完全失效。原因:不同进程锁的不是同一个对象了。
(3)SharePreferences的可靠性下降。原因:SharePreferences底层是通过读/写XML文件来实现的,并发 写或者读/写 显然是可能出现问题的。
(4)Application会多次创建。原因:运行在不同(进程)中的组件是属于不同的(虚拟机和Application以及内存空间)。