当前位置: 首页 > news >正文

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

Android 跨进程之间通信

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

文章目录

  • Android 跨进程之间通信
  • 前言
  • 一、ContentProvider 是什么?
  • 二、如何利用ContentProvider跨进程通信
    • 1.创建自定义ContentProvider
    • 2.清单文件声明注册
    • 3.发送消息
    • 4.杀掉进程测试
  • 小结


前言

当谈到在 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方法中写接收消息的逻辑判断,代码示例如下。

@Overridepublic 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发消息的路径名称

 <application><providerandroid: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发送消息

 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的形式进行通信不用关心壳包是否被杀死也可以收到消息。

相关文章:

  • 信号处理设计模式
  • 【Linux】修复 Linux 错误 - 权限被拒绝
  • Pycharm引用其他文件夹的py
  • docker学习(十九、network使用示例bridge)
  • 16-网络安全框架及模型-BiBa完整性模型
  • TypeError: control character ‘delimiter‘ cannot be a newline (`\r` or `\n`)
  • OpenGL FXAA抗锯齿算法(Qt)
  • css中的BFC
  • LLM应用的分块策略
  • 记矩阵基础概念
  • OSG读取和添加节点学习
  • 渗透测试 | php的webshell绕过方法总结
  • 《MySQL系列-InnoDB引擎01》MySQL体系结构和存储引擎
  • 黑豹程序员-vue3下载文件
  • 学习笔记 k8s常用kubectl命令
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Cookie 在前端中的实践
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • js写一个简单的选项卡
  • Mocha测试初探
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • storm drpc实例
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 简单实现一个textarea自适应高度
  • 近期前端发展计划
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 我看到的前端
  • 学习使用ExpressJS 4.0中的新Router
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​学习一下,什么是预包装食品?​
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (javascript)再说document.body.scrollTop的使用问题
  • (Matlab)使用竞争神经网络实现数据聚类
  • (二十四)Flask之flask-session组件
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)nsfocus-绿盟科技笔试题目
  • (转)程序员技术练级攻略
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET性能优化(文摘)
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @synthesize和@dynamic分别有什么作用?
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [17]JAVAEE-HTTP协议
  • [ACM] hdu 1201 18岁生日
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [C/C++随笔] char与unsigned char区别
  • [Flex] PopUpButton系列 —— 控制弹出菜单的透明度、可用、可选择状态
  • [HDOJ4911]Inversion