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.mzph.cn/news/589930.shtml

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

相关文章

关于发展模式加入变量的问题解决

问题1描述&#xff1a; 编译的时候不报错&#xff0c;但是在运行的时候出错输出 FLDLST: ustar in fincl( 17 ) not found ENDRUN: called without a message string 问题1解决&#xff1a; 这是因为在cas-esm 的atm_in 中写入了某个变量&#xff0c;但是在F90 代码里面没…

python使用动态规划解决不同路径问题

针对二维动态规划&#xff0c;还有一个问题就是关于求不同路径的实例&#xff0c;主要是说明在实际应用的场景中&#xff0c;要理解透彻实际问题的真正目的&#xff0c;就可以灵活实现代码编写。 对于求不同路径问题描述&#xff0c;对于一个机器人&#xff0c;处在一个mxn的网…

【Java 进阶篇】Maven 使用详解:打造便捷高效的项目构建利器

在软件开发的道路上&#xff0c;项目构建是一个不可避免的过程。而Maven&#xff0c;作为一个强大的项目管理和构建工具&#xff0c;为开发者提供了一套标准化的项目结构和构建流程。本文将围绕Maven的使用详解&#xff0c;手把手地带你探索Maven的世界&#xff0c;让你在项目构…

XTU-OJ-1452-完全平方数-笔记

参考博客 XTU-OJ 1452-完全平方数 题意 输入一个奇数&#xff0c;使得 n*(2*an-1)/2是一个完全平方数&#xff0c;求满足条件的最小的a 1<n<1e9 先输入样例数&#xff0c;再输入n 输入 2 1 3 输出 0 2 代码 #include<stdio.h>#define N 1000000010int a…

【UnityShader入门精要学习笔记】(1)了解渲染流水线

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 渲染流水线什么是流水线什么…

【教3妹学编程-算法题】经营摩天轮的最大利润

3妹&#xff1a;“打个中国结&#xff0c;再系个红腰带&#xff0c; 愿善良的人们天天好运来, 你勤劳生活美, 你健康春常在, 你一生的忙碌为了笑逐颜开。” 2哥 : 3妹&#xff0c;元旦快乐啊。 3妹&#xff1a;2哥元旦快乐~。 2哥&#xff1a;祝新的一年&#xff0c;3妹技术突飞…

SPI通信

SPI通信 1、SPI通信概述 SPI(Serial peripheral interface)是一种同步、串行、全双工、总线制、主从工作方式。 有四线控制&#xff1a; SDO——主设备数据输出&#xff0c;从设备数据输入&#xff0c;对于MOSI output slave inputSDI——主设备数据输入&#xff0c;从事设备…

Linux之进程管理

什么是进程 在linux中每个执行的程序都称为一个进程&#xff0c;每个进程都分配一个ID号&#xff08;pid进程号&#xff09;。每个进程都可能以两种方式存在&#xff0c;即前台和后天。前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作&#xff0c;但屏幕…

计算机网络【Google的TCP BBR拥塞控制算法深度解析】

Google的TCP BBR拥塞控制算法深度解析 宏观背景下的BBR 慢启动、拥塞避免、快速重传、快速恢复&#xff1a; 说实话&#xff0c;这些机制完美适应了1980年代的网络特征&#xff0c;低带宽&#xff0c;浅缓存队列&#xff0c;美好持续到了2000年代。 随后互联网大爆发&#x…

滴水逆向三期笔记与作业——02C语言——09 字节对齐_结构体数组

09 字节对齐_结构体数组 一、sizeof关键字1.1 基本类型的sizeof1.2 数组类型的sizeof1.3 结构体类型的sizeof 二、字节对齐--结构体对齐2.1 结构体对齐2.2 对齐规则2.2.1对其参数规则2.2.2 数据成员对齐规则2.2.2.3 结构体的总大小2.2.2.4 结构体嵌套 三、typedef关键字3.1 对已…

Python如何把类当做字典来访问及浅谈Python类命名空间

Python如何把类当做字典来访问 Python把类当做字典来访问 定义一个类将它实例化&#xff0c;我们可以通过obj.属性来访问类的属性&#xff0c;如果想获取类的所有实例变量&#xff0c;我们可以使用obj.__dict__来访问&#xff0c;如下&#xff1a; class A:def __init__(self)…

mount -a 出错任然重启问题

问题来源 在磁盘分区挂载过后&#xff0c;为了创建的新分区的能够永久挂载&#xff0c;我们常常会在/etc/fstab下写下配置文件&#xff0c;使其永久挂载。但是该配置一旦写错&#xff0c;就面临这死机问题&#xff0c;为此&#xff0c;以下操作针对该问题进行 解决方案&#x…

[每周一更]-(第43期):Golang版本的升级历程

从1.13接触go语言开始更新我们公司内第一个Go项目&#xff0c;直至现在go版本已经发展到1.20&#xff08;20230428&#xff09;&#xff0c;我们从go发版开始认识go语言&#xff0c;有利于我们更深入 了解这门语言&#xff0c;洞悉一些深层方式&#xff0c;加深我们学习的动力&…

3294 李白的酒

#include<bits/stdc.h> using namespace std; int main(){int n;double ans;scanf("%d",&n);for(int i1;i<n;i)ans1,ans/2;printf("%.5f",ans); }

基于蚁狮算法优化的Elman神经网络数据预测 - 附代码

基于蚁狮算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于蚁狮算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于蚁狮优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

CMake入门教程【基础篇】CMake+Minggw构建项目

文章目录 Minggw是什么Minggw下载CMake下载安装第1步&#xff1a;下载CMake第2步&#xff1a;安装CMake 如何构建和编译项目&#xff1a;使用CMake和MinGW总结 Minggw是什么 MinGW&#xff08;Minimalist GNU for Windows&#xff09;是一个免费的软件开发环境&#xff0c;旨在…

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

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

C#中string.ToUpper()和string.ToLower()的用法

目录 一、关于ToUpper()和ToLower() 1.ToUpper() 2.ToLower() 3.小结 二、实例 三、生成效果 一、关于ToUpper()和ToLower() 1.ToUpper() 使用字符串对象的ToUpper方法可以将字符串中的字母全部转换为大写。 string P_str_book "mingribook".ToUpper()…

AD教程 (二十一)模块化布局规划

AD教程 &#xff08;二十一&#xff09;模块化布局规划 原理图是按照我们的功能模块去进行排布划分的 利用交叉选择模式分屏快速进行模块化布局 分屏&#xff0c;选中任意文档&#xff0c;右击&#xff0c;点击垂直分割 交叉选择模式&#xff0c;点击工具&#xff0c;交叉选…

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

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