Android IPC机制(一)多进程模式

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" />

在上面的代码中,我们为 SecondActivityThirdActivity 使用了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以及内存空间)。

相关推荐
带电的小王16 分钟前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
梦想平凡29 分钟前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道1 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
阿甘知识库2 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
元争栈道2 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
MuYe2 小时前
Android Hook - 动态加载so库
android
居居飒3 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
Henry_He6 小时前
桌面列表小部件不能点击的问题分析
android
工程师老罗6 小时前
Android笔试面试题AI答之Android基础(1)
android
qq_397562318 小时前
android studio更改应用图片,和应用名字。
android·ide·android studio