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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/313422.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在宝塔Linux中安装Docker

前言 帮助使用宝塔的用户快速上手docke的安装 &#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Docker》。&#x1f3af;&#x1f3af…

简单Diff算法

简单Diff算法 渲染器的核心 Diff算法 解决的问题 比较新旧虚拟节点的子节点&#xff0c;实现最小化更新。 虚拟节点key属性的作用 就像虚拟节点的“身份证号”&#xff0c;在更新时&#xff0c;渲染器会通过key属性找到可复用的节点&#xff0c;然后尽可能地通过DOM移动操…

软件测试/测试开发丨Linux 数据处理三剑客学习笔记

一、Linux 三剑客之 grep 1、 内容检索 获取行&#xff08;单行&#xff09; grep pattern file获取内容 grep -o pattern file获取上下文 grep -A -B -C pattern file 2、 文件检索 递归搜索 grep pattern -r dir/展示匹配文件名 grep -H 111 /tmp/1只展示匹配文件名 grep …

[情商-3]:理解男女思维方式、心理诉求、情绪诉求的差别

目录 前言&#xff1a; 一、感性思维 VS 理性思维 1.1 感性思维 VS 理性思维 1.2 情绪 VS 事情本身 1.3 情绪感知 VS 逻辑推理 二、情绪的表达 2.1 表达方式 2.2 表达途径 三、不明说的情绪和倾诉诉求&#xff1a;隐藏在情绪表达方式之下的情绪与情绪诉求 3.0 快乐愉…

常见网络设备及功能详解

网络设备 - 交换机 交换机&#xff1a;距离终端用户最近的设备&#xff0c;用于终端用户接入网络、对数据帧进行交换等。 交换机的功能&#xff1a; 终端设备&#xff08;PC、服务器等&#xff09;的网络接入二层交换&#xff08;Layer 2 Switching&#xff09; 网络设备 - …

思维链COT原理探究

要进行因果分析&#xff0c;需要把思维链中的不同元素拆解开来&#xff0c;然后通过控制变量实验&#xff0c;来研究不同元素对COT效果的影响。以下两篇论文的核心差异就在于: COT的变量拆解&#xff0c;以及控制变量的实验方式。 结合两篇论文的实验结论&#xff0c;可能导致…

如何在Linux系统中安装Redis

原本Redis官网提供了Windows和Linux两个版本&#xff0c;但从 2011-12-29 以后不再更新Windows版本&#xff08;https://github.com/dmajkic/redis/downloads&#xff09;&#xff0c;加之企业生产环境通常使用Linux系统&#xff0c;所以这里在Linux系统中演示如何安装Redis。 …

十八、任务通知

1、前言 (1)所谓“任务通知”&#xff0c;可以反过来读"通知任务"。我们使用队列、信号量、事件组等等方法时&#xff0c;并不知道对方是谁。使用任务通知时&#xff0c;可以明确指定&#xff1a;通知哪个任务。 (2)使用队列、信号量、事件组时&#xff0c;我们都需…

Pycharm引用其他文件夹的py

Pycharm引用其他文件夹的py 方式1&#xff1a;包名设置为Sources ROOT 起包名的时候&#xff0c;需要在该文件夹上&#xff1a;右键 --> Mark Directory as --> Sources ROOT 标记目录为源码目录&#xff0c;就可以了。 再引用就可以了 import common from aoeweb impo…

Select工作原理

I/O多路复用是一种并发处理的机制&#xff0c;允许一个进程通过一种机制监视多个描述符&#xff0c;从而在有多个I/O操作需要处理时选择其中之一进行服务。select 函数是一种常见的实现 I/O 多路复用的系统调用&#xff0c;它允许一个进程同时监视多个文件描述符的可读性、可写…

医院安全(不良)事件报告系统源码 支持二次开发、支持源码交付

医疗不良事件报告系统源码旨在建立全面的、统一的医疗不良事件标准分类系统和患者安全术语&#xff0c;使不良事件上报管理更加标准化和科学化。通过借鉴国内外医疗不良事件报告系统的先进经验&#xff0c;根据医疗不良事件的事件类型、处理事件的不同部门&#xff0c;灵活设置…

vu3-14

第一个需求是在用户登录成功之后&#xff0c;在主页显示用户的真实姓名和性别&#xff0c;这些信息要调用后端API获取数据库里面的信息&#xff0c;第二个需求是点击菜单1&#xff0c;在表单中修改用户信息之后&#xff0c;更新到后端数据库&#xff0c;然后在主页同步更新用户…