Android 跨进程之间通信(IPC)方式之ContentProvider

Android 跨进程之间通信

  1. Android 跨进程之间通信(IPC)方式之BroadcastReceiver
  2. Android 跨进程之间通信(IPC)方式之ContentProvider

文章目录


前言

当谈到在 Android 上实现跨进程通信(IPC)时,ContentProvider 往往是一个备受关注的话题。ContentProvider 作为 Android 中的一种数据共享机制,最初设计用于应用内数据的共享和访问,但它也被广泛应用于不同应用程序之间的进程间通信。

上一篇文章讲述了如何利用BroadcastReceiver在进程之间通信,用广播的方式虽然能够达到通信效果,但是在进程被杀死的情况下还是无法通信。所以本文来介绍另一种进程之间的通信方式在进程被意外杀死的情况下依然可以接收到另一个进程的消息。


一、ContentProvider 是什么?

ContentProviderAndroid 系统提供的一种用于管理应用程序数据的组件。尽管其名称可能会让你误以为它仅仅提供数据存储的功能,但实际上它更像是一个数据访问的中间层,允许应用程序之间共享数据,并提供统一的接口供其他应用程序访问和操作这些数据。

主要用途包括:

  1. 数据共享ContentProvider 可以允许应用程序之间共享数据。这些数据可以是结构化的、非结构化的,甚至可以是文件、数据库中的数据等。
  2. 数据访问 :通过ContentProvider 提供的标准化接口,其他应用程序可以访问和操作相应应用程序的数据,包括增删改查等操作。
  3. URI 访问ContentProvider 使用 URI来标识数据,其他应用程序可以使用 URI来定位和访问特定数据。
  4. 权限控制ContentProvider 可以定义权限来控制哪些应用程序有权访问数据,从而保护数据安全性。

二、如何利用ContentProvider跨进程通信

1.创建自定义ContentProvider

在A项目中创建一个名为AppProvider的类,继承ContentProvider,主要是在call方法中写接收消息的逻辑判断,代码示例如下。

kotlin 复制代码
@Override
    public Bundle call(String method, String arg, Bundle extras) {
        if ("receive_B_msg".equals(method)) {
            String packageName = extras.getString("packageName");
            Log.d("call", "--- AppProvider receive_B_msg packageName:" + packageName);
            if (mContext != null){
                //你的逻辑操作
            }else {
                Log.d("call", "--- AppProvider call() mContext is null");
            }
            return extras;
        }
        return null;
    }

2.清单文件声明注册

在A项目的清单文件内对自定义的AppProvider进行声明注册。其中authorities是B发消息的路径名称

kotlin 复制代码
 <application>
  <provider
            android:name=".AppProvider"
            android:authorities="aaaaaaaa"
            android:exported="true" />
 </application>
  <queries>
       <package android:name="com.xzhy.bdemo" />
       <provider android:authorities="com.xzhy.bdemo.AppProvider" />
   </queries>

3.发送消息

在B项目中调用下面代码对A发送消息

kotlin 复制代码
 ContentResolver resolver = getContentResolver();
				 Bundle extras = new Bundle();
				 extras.putString("clsName", "SomeClassName");
				 extras.putString("status", "SomeStatus");
				 extras.putString("packageName", "com.xzhy.bdemo");
				 extras.putString("processName", "SomeProcessName");
				 resolver.call(Uri.parse("content://aaaaaaaa"), "receive_B_msg", null, extras);

查看A项目的日志可以发现已经成功收到了B发来的消息。

4.杀掉进程测试

在真机上面使用A、B两个进程关闭掉A的情况下发消息,B进程项目是会报错的无法找到路径,但是在模拟器7.0的手机上测试却不会报错显示。

小结

本文简单的介绍了如何利用ContentProvider在跨进程之间进行通信,需要注意的是虽然在杀死掉进程A后B进程发消息会受影响,但实际上在同一个App下开启另一个进程在原本进程和新开进程之间用这种方式即使进程被杀死也依然是可以做到通信的。本文仅仅是开两个App进程进行的测试,遇到的业务场景比如说在一个APP下你用来做壳包,通过虚拟加载的形式在打开App后安装了另一个App,此时新的App需要与原本的壳包进程进行通信可以采用ContentProvider的形式进行通信不用关心壳包是否被杀死也可以收到消息。

相关推荐
xiangpanf1 天前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx1 天前
安卓线程相关
android
消失的旧时光-19431 天前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon1 天前
VSYNC 信号流程分析 (Android 14)
android
dalancon1 天前
VSYNC 信号完整流程2
android
dalancon1 天前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户69371750013841 天前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android1 天前
Android 刷新一帧流程trace拆解
android
墨狂之逸才1 天前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶1 天前
记一次Gradle环境的编译问题与解决
android·前端·gradle