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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

伺服电机:原点复位

一、原点复位概念 原点复位指的是&#xff0c;在驱动器使能时&#xff0c;触发原点复位功能后&#xff0c;电机将主动查找零点&#xff0c;完成定位功能。 那么问题来了&#xff0c;什么是原点&#xff0c;什么是零点&#xff1f; 原点&#xff1a;即机械原点&#xff0c;可…

面向对象知识点

类和对象知识点梳理 1. 类和对象的概念 类是对一类事物的描述&#xff0c;是抽象的、概念上的定义。Java 中定义类的关键字是&#xff1a;class。 具有相同特征和行为的对象抽象成类&#xff0c;类描述了这一类对象的属性和方法&#xff1a; 属性&#xff08;成员变量&#x…

分布式技术之数据复制技术

文章目录 什么是数据复制技术&#xff1f;数据复制技术原理及应用同步复制技术原理及应用异步复制技术原理及应用半同步复制技术原理及应用三种数据复制技术对比 什么是数据复制技术&#xff1f; 数据复制是一种实现数据备份的技术。数据复制技术&#xff0c;可以保证存储在不…

3D目标检测(教程+代码)

随着计算机视觉技术的不断发展&#xff0c;3D目标检测成为了一个备受关注的研究领域。与传统的2D目标检测相比&#xff0c;3D目标检测可以在三维空间中对物体进行定位和识别&#xff0c;具有更高的准确性和适用性。本文将介绍3D目标检测的相关概念、方法和代码实现。 一、3D目…

回溯法寻找元素之和等于目标值的子集

这是一个回溯法的算法,可以用来寻找所有元素之和等于目标值的子集. 整个算法中最重要的是:在递归之后"恢复现场" 也就是: t[cnt]0; cnt--; 完整代码(注释部分打印信息可以用来辅助理解递归过程)&#xff1a; #include<iostream> #include<cstring> …

RFC7636-PKCE

前言 PKCE &#xff08;RFC 7636&#xff09; 是授权代码流的扩展&#xff0c;用于防止 CSRF 和授权代码注入攻击。 PKCE 不是客户端身份验证的一种形式&#xff0c;PKCE 不能替代客户端密码或其他客户端身份验证。即使客户端使用客户端密码或其他形式的客户端身份验证&#…

oracle物化视图

物化视图定义 视图是一个虚拟表&#xff08;也可以认为是一条语句&#xff09;&#xff0c;基于它创建时指定的查询语句返回的结果集&#xff0c;每次访问它都会导致这个查询语句被执行一次&#xff0c;为了避免每次访问都执行这个查询&#xff0c;可以将这个查询结果集存储到…

【STM32】STM32学习笔记-输入捕获测频率和占空比(18)

00. 目录 文章目录 00. 目录01. 预留02. 输入捕获测频率接线图03. 输入捕获测频率示例04. 输入捕获测频率和占空比接线图05. 输入捕获测频率和占空比示例06. 示例程序下载07. 附录 01. 预留 02. 输入捕获测频率接线图 03. 输入捕获测频率示例 pwm.h #ifndef __PWM_H #define…

从入门到精通UNet: 让你快速掌握图像分割算法

文章目录 一、UNet 算法简介1.1 什么是 UNet 算法1.2 UNet 的优缺点1.3 UNet 在图像分割领域的应用 二、准备工作2.1 Python 环境配置2.2 相关库的安装 三、数据处理3.1 数据的获取与预处理3.2 数据的可视化与分析 四、网络结构五、训练模型5.1 模型训练流程5.2 模型评估指标5.…

【JS逆向】逆向案例之 ----- 安某客滑块

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 安某客滑块小结 1. 初步分析 总共分为两步&#xff0c; 获取滑块图片信息检查滑块移动是否正确 整体框架如下&#xff1a; 1.1 getinfoTp 获取图片信息…

Plantuml之JSON数据语法介绍(二十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Nx市工业数据洞察:Flask、MySQL、Echarts的可视化之旅

Nx市工业数据洞察&#xff1a;Flask、MySQL、Echarts的可视化之旅 背景数据集来源技术选型功能介绍创新点总结 背景 随着工业化的不断发展&#xff0c;Nx市工业数据的收集和分析变得愈发重要。本博客将介绍如何利用Flask、MySQL和Echarts等技术&#xff0c;从统计局获取的数据…

【Java进阶篇】JDK新版本中的新特性都有哪些

JDK新版本中的新特性都有哪些 ✔️经典解析✔️拓展知识仓✔️本地变量类型推断✔️Switch 表达式✔️Text Blocks✔️Records✔️封装类✔️instanceof 模式匹配✔️switch 模式匹配 ✅✔️虚拟线程 ✔️经典解析 JDK 8中推出了Lambda表达式、Stream、Optional、新的日期API等…

Halcon闭运算closing

Halcon闭运算 文章目录 Halcon闭运算 闭运算的计算步骤&#xff0c;为先膨胀&#xff0c;后腐蚀。这两步操作能将看起来很接近的元素&#xff0c;如区域内部的空洞或外部孤立的点连接成一体&#xff0c;区域的外观和面积也不会有明显的改变。通俗地说&#xff0c;就是类似于“填…

echarts 折线图根据x轴时间渲染不同颜色的折线

footIm 如上图所示一条折线多种颜色 后端数据返回"data": [ { “dateTime”: “2023-10-11 00:02:10”, “pos”: 6, “curr”: 104.6 }, { “dateTime”: “2023-10-11 00:02:39”, “pos”: 7, “curr”: 104.6 }&#xff0c; …] 我们拿到后端返回的res.data传递给…

mysql原理--Explain详解

1.概述 一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的 执行计划 &#xff0c;这个执行计划展示了接下来具体执行查询的方式&#xff0c;比如多表连接的顺序是什么&#xff0c;对于每个表采用什么访问方法来具体执行查询等等。设计 MySQL 的…

Java EE Servlet之Cookie 和 Session

文章目录 1. Cookie 和 Session1.1 Cookie1.2 理解会话机制 (Session)1.2.1 核心方法 2. 用户登录2.1 准备工作2.2 登录页面2.3 写一个 Servlet 处理上述登录请求2.4 实现登录后的主页 3. 总结 1. Cookie 和 Session 1.1 Cookie cookie 是 http 请求 header 中的一个属性 浏…

【微服务】2.创建多个服务器

vmware有克隆功能直接拷贝以及设置好的虚拟机 如果要自己设置IP地址&#xff0c;修改/etc/sysconfig/network-scripts/ 编辑ifcfg-ens33需改ip地址 #开机加载网络配置启动网络服务 ONBOOT"yes" #分配ip的协议 none static :不自动分配&#xff0c;手动设置ip / dhcp…

Iterator(迭代器) 和 list

Iterator&#xff08;迭代器&#xff09; 和 list 文章目录 一、Iterator&#xff08;迭代器&#xff09;二、list 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Iterator&#xff08;迭代器&#xff09; 对 collection 进行迭代的迭代器。迭代器…

基于简化版python+VGG+MiniGoogLeNet的智能43类交通标志识别—深度学习算法应用(含全部python工程源码)+数据集+模型(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建1&#xff09;VGG模型简化版2&#xff09;GoogLeNet简化版——MiniGoogLeNet 3. 模型训练及保存 相关其它博客工程源代码下载其它资料下载 前言 本项目专注于解决出国自驾游特定场景下的交…