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

Android中的进程间通讯

一、简介

进程间通讯(InterProcess Communication)

指在不同进程之间传播或交换信息,Android是基于Linux 系统的,在Linux 中进程间是不能直接通讯的,IPC就是为了解决这一问题

每个操作系统都有相应的IPC机制,Android中一个进程会对应一个虚拟机实例,不同的虚拟机在内存分配上有不同的地址空间

只有在多进程的环境下才会使用IPC进行通讯

二、使用场景

  • 多模块应用:由于Android应用受到系统的最大内存限制,为了获得更多的内存空间将不同的模块放在不同的线程中,此时需要用到跨进程通信
  • 其它应用:获取其它应用里的数据,比如:获取通讯录和短信

三、实现多进程

Android默认是运行在包名的进程中,可以通过修改AndroidManifest文件,在 application 标签下添加 android:process 属性可以修改Android默认的进程名字

给四大组件(Activity Service Broadcast ContentProvider)设置android:process属性来实现多进程

四、造成的问题

  • 多进程会造成Application的多次创建:当一个组件需要运行在新的进程中时,实际的创建过程就相当于又重新启动了一次应用,就会创建Application。而运行在不同进程中的组件,不仅属于不同的虚拟机,而且其Application也是不同的。
  • 多进程会导致静态成员和单例完全无效:由于不同进程都被分配了独立且不同的虚拟机,其在内存分配上有这不同的地址空间。这就会导致在着一个类的多个副本,各自修改互不影响。
  • 多进程模式下,线程的同步机制也会失效:因为不同的进程,其线程不所属同一内存,那么无论是对象锁还是类锁,锁本身都不是同一个了。
  • 多进程模式下SharedPreferences风险会增大:SharedPreferences底层是通过文件读写实现的,并发操作可能会造成问题。

在不同进程中的组件,如果使用内存来通讯,都会存在隐患或者直接失败。这就是多进程带来的最主要的影响。

五、Android中的跨进程通讯(IPC)

利用Bundle

        在Android开发中,

Activity,Service,Receiver 都支持在 Intent 中传递 Bundle 数据,而 Bundle实现了 Parcelable 接口,以键值对的方式保存数据,可以在不同的进程间进行传输。 可以将其视为一个容器,其支持基本数据类型(String、int、boolean、byte、float、long、double)以及它们对应的数据。当需要传递对象或对象数组时,被传递的对象必须实现Serialiable或Parcelable接口。

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("msg", "message");
intent.putExtras(bundle);
startActivity(intent);

使用文件共享

        通过共享文件,不同的进程可以使用读写文件的方式交换数据

        不要使用SharedPreferences去做跨进程通讯,原则上它不支持多进程。虽然它本质上也是一个文件,但是由于它在应用运行时会在内存中加载缓存,然而进程间是不能内存共享的,每个进程操作的SharedPreferences都会是一个单独的实例,这就会导致安全性问题,这个问题只能通过多进程间其它的通信方式或者是在确保不会同时操作SharedPreferences数据的前提下使用SharedPreferences来解决。

使用ContentProvider

        ContentProvider提供一种应用管理其自身和其他应用所存储数据的能力,并提供与其他应用共享这些数据的方法。它会封装数据,并提供用于定义数据安全性的机制。无论你是否需要和其他应用分享数据,你都可以使用ContentProvider去访问这些数据,虽然当无需和其他应用共享数据时没必要使用它。系统预置了许多ContentProvider,比如通话记录,通讯录,信息等,只需要通过ContentProvider就可以拿到这些信息。ContentProvider以一个或多个表的形式将数据呈现给外部应用,这些表与关系型数据库中的表类似。行表示提供程序收集的某种类型数据的实例,行中的每一列表示为一个实例所收集的单个数据。

        ContentProvider 的底层数据,可以是 SQLite 数据库,可以是文件,也可以是内存中的数据。

使用场景:

  • 通过实现代码访问其他应用中的现有的ContentProvider用来获得数据;
  • 创建新的ContentProvider,与其他应用共享数据。

使用Messenger

       Messenger是一种轻量级的 IPC 方案,可以在不同进程中传递 Message 对象,它一次只处理一个请求。Messenger通过Handler将Message发送到另一个进程,实现了进程间通信,底层依然是使用了Binder机制,其本质上也是基于AIDL实现的。
        Messenger的缺点:

  • 服务端是以串行的方式在处理消息,不太适合用来出来大量的并发请求。
  • 主要作用是传递消息,不太适合用来跨进程调用方法。

使用方式:构建一个运行在独立进程中的服务端Service,创建Messenger,将Messenger的binder返回给Service的onBind方法。然后接收客户端Messege需要用Handler接收

服务端:

public class MessengerService extends Service {/*** 处理客户端消息,并用于构建Messenger*/private static class MessengerHandler extends Handler {@Overridepublic void handleMessage(@NonNull Message msg) {switch (msg.what) {case 100:System.out.println(msg.getData().getString("data"));sendToClient(msg);break;}}}/*** 给客户度发送消息*/private static void sendToClient(Message message) {Messenger client = message.replyTo;  //通过 message拿到客户传递过来的 Messenger,通过该对象发送message//当然,回传消息还是要通过messageMessage msg = Message.obtain(null, 100);Bundle bundle = new Bundle();bundle.putString("data", "客户端, 我收到你的消息了");msg.setData(bundle);try {client.send(msg);} catch (RemoteException e) {e.printStackTrace();}}/*** 构建Messenger对象*/private final Messenger mMessenger = new Messenger(new MessengerHandler());@Nullable@Overridepublic IBinder onBind(Intent intent) {//将Messenger对象的Binder返回给客户端return mMessenger.getBinder();}
}

注册service

        <service android:name=".messenger.MessengerService"android:process=":messengerprocess"/>

客户端:

class MainActivity : ComponentActivity() {private var mService: Messenger?= nullprivate lateinit var btnMsg: Buttonoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)btnMsg = findViewById(R.id.btn_msg)//绑定servicebindService(Intent(this, MessengerService::class.java),connection, Context.BIND_AUTO_CREATE)btnMsg.setOnClickListener {mService?.let {//创建消息,通过Bundle传递数据var message = Message.obtain(null, 100)message.data = Bundle().apply {putString("data", "服务端,我给你发送消息了")}//将客户端的Messenger对象传递给服务端,才能让双方互相通信message.replyTo = mClientMessenger//像服务端进程发送消息it.send(message)}}}/*** 客户端Messenger对象*/private val mClientMessenger: Messenger = Messenger(MessengerHandler())/*** 用于构建客户端的Messenger对象,并处理服务端的消息*/private class MessengerHandler : Handler() {override fun handleMessage(msg: Message) {when (msg.what) {100 -> {println(msg.data.getString("data"))}}}}private val connection: ServiceConnection = object: ServiceConnection {override fun onServiceConnected(name: ComponentName?, ibinder: IBinder?) {mService = Messenger(ibinder)}override fun onServiceDisconnected(name: ComponentName?) {}}override fun onDestroy() {//解绑serviceunbindService(connection)super.onDestroy()}
}

AIDL

        AIDL底层也是通过Binder实现的。
        Messenger 是以串行的方式处理客户端发来的消息,如果大量消息同时发送到服务端,服务端只能一个一个处理,所以大量并发请求就不适合用 Messenger ,而且Messenger 只适合传递消息,不能跨进程调用服务端的方法。AIDL 可以解决并发和跨进程调用方法的问题

支持数据类型:

  • 八种基本数据类型:byte、char、short、int、long、float、double、boolean
  • String,CharSequence
  • 实现了Parcelable接口的数据类型
  • List 类型。List承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象
  • Map类型。Map承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象

aidl跨进程通信的步骤:

  1. 创建aidl文件
  2. build后生成aidl对应的java文件
  3. 创建服务端Service
  4. 创建客户端Activity,bindService(),获取IBinder的proxy 

Socket

        Socket也称作“套接字“,是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。
分为流式套接字和数据包套接字,分别对应网络传输控制层的TCP和UDP协议

相关文章:

Android中的进程间通讯

一、简介 进程间通讯&#xff08;InterProcess Communication&#xff09; 指在不同进程之间传播或交换信息&#xff0c;Android是基于Linux 系统的&#xff0c;在Linux 中进程间是不能直接通讯的&#xff0c;IPC就是为了解决这一问题 每个操作系统都有相应的IPC机制&#x…...

day03vue学习

day03 一、今日目标 1.生命周期 生命周期介绍生命周期的四个阶段生命周期钩子声明周期案例 2.综合案例-小黑记账清单 列表渲染添加/删除饼图渲染 3.工程化开发入门 工程化开发和脚手架项目运行流程组件化组件注册 4.综合案例-小兔仙首页 拆分模块-局部注册结构样式完善…...

32. 最长有效括号

给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号 子串 的长度。 示例 1&#xff1a; 输入&#xff1a;s "(()" 输出&#xff1a;2 解释&#xff1a;最长有效括号子串是 "()"示例 2&#xff1a; 输…...

如何在 docker 容器内部运行 docker命令

场景&#xff1a; 有些场景在容器内部需要调用 docker 命令。为此&#xff0c;本文梳理2种可以在容器内部执行docker命令的方法。 方法1&#xff1a;基于 docker.sock /var/run/docker.sock是默认的Unix socket(套接字)&#xff0c;socket是同一机器中进程间通讯的一种方式。…...

Poly Kernel Inception Network在遥感检测中的应用

摘要 https://export.arxiv.org/pdf/2403.06258 遥感图像&#xff08;RSI&#xff09;中的目标检测经常面临一些日益严重的挑战&#xff0c;包括目标尺度的巨大变化和多样的上下文环境。先前的方法试图通过扩大骨干网络的空间感受野来解决这些挑战&#xff0c;要么通过大核卷积…...

tiktok 与 赵长鹏 遭遇了什么

对于美丽国来说&#xff0c;比特币是国家资产&#xff0c;赵长鹏动了国家资产的奶酪&#xff0c;当然要被消灭&#xff1b;新闻媒体是国家资产&#xff0c;TIKTOK作为新兴媒体也动了国家资产的奶酪&#xff0c;当然也在消灭之列&#xff1b;高端芯片、波音飞机也是国家资产&…...

Lua中文语言编程源码-第七节,更改lstrlib.c 标准字符串操作与模式匹配库函数, 使Lua加载中文库关键词(标准字符串操作与模式匹配库相关)

源码已经更新在CSDN的码库里&#xff1a; git clone https://gitcode.com/funsion/CLua.git在src文件夹下的lstrlib.c 标准字符串操作与模式匹配库函数&#xff0c;表明这个C源文件实现了Lua的标准字符串操作与模式匹配库&#xff0c;即提供了与字符串操作相关的API和功能实现…...

EtherCAT开源主站 IGH 介绍及主站伺服控制过程

目录 前言 IGH EtherCAT主站介绍 主要特点和功能 使用场景 SOEM 主站介绍 SOEM 的特点和功能 SOEM 的使用场景 IGH 主站 和 SOEM对比 1. 功能和复杂性 2. 资源消耗和移植性 3. 使用场景 EtherCAT 通信原理 EtherCAT主站控制伺服过程 位置规划模式 原点复归模式…...

自然语言:python实现自然语言处理中计算文件中的英语字母的熵

下面是一个示例代码&#xff0c;实现了计算文件中英语字母的熵的功能。 import mathdef calculate_entropy(text):# 统计字母的出现次数letter_count {}total_count 0for char in text:if char.isalpha():char char.lower()letter_count[char] letter_count.get(char, 0) …...

分类预测 | Matlab实现BiTCN双向时间卷积神经网络数据分类预测/故障识别

分类预测 | Matlab实现BiTCN双向时间卷积神经网络数据分类预测/故障识别 目录 分类预测 | Matlab实现BiTCN双向时间卷积神经网络数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现BiTCN双向时间卷积神经网络数据分类预测/故障识别。 2.自…...

基于SpringBoot的后勤管理系统【附源码】

后勤管理系统开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myecli…...

智能仓储系统|基于JSP技术+ Mysql+Java+ Tomcat的智能仓储系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…...

Layui实现删除及修改后停留在当前页

1、功能概述&#xff1f; 我们在使用layui框架的table显示数据的时候&#xff0c;会经常的使用分页技术&#xff0c;这个我们期望能够期望修改数据能停留在当前页&#xff0c;或者删除数据的时候也能够停留在当前页&#xff0c;这样的用户体验会更好一些&#xff0c;但往往事与…...

小型研发型企业,如何筛选合适的内外网数据交换方案?

研发型企业是社会经济发展的重要组成&#xff0c;研发型企业是一种以研发创新为主要驱动力的企业。这些企业主要注重技术创新和产品研发&#xff0c;致力于将新的科技成果转化为市场竞争力。它们通常拥有强大的研发团队和研发设施&#xff0c;投入大量资源用于技术研究和产品开…...

Visual Studio 常用快捷键

执行调试&#xff1a; F5 调试 F5: 启动调试 ShiftF5: 停止调试 CtrlShiftF5: 重启调试 执行&#xff08;调试&#xff09; CtrlF5: 开始执行(不调试) F10: 逐过程 F11: 逐语句 断点 F9: 启用/关闭断点 CtrlF9: 停止断点 CtrlShiftF9: 删除全部断点 格式化代码 Ctrl kd …...

【WEEK3】 【DAY4】JSON Interaction Handling Part Three【English Version】

2024.3.14 Thursday Following the previous article 【WEEK3】 【DAY3】JSON Interaction Handling Part Two【English Version】 Contents 6.7. Writing Abstract Classes6.7.1. Reason6.7.2. Create JsonUtils.java6.7.3. Add a method json6 in UserController to verify…...

蓝桥杯物联网竞赛_STM32L071_12_按键中断与串口中断

按键中断&#xff1a; 将按键配置成GPIO_EXTI中断即外部中断 模式有三种上升沿&#xff0c;下降沿&#xff0c;上升沿和下降沿都会中断 external -> 外部的 interrupt -> 打断 trigger -> 触发 detection -> 探测 NVIC中将中断线ENABLE 找接口函数 在接口函数中写…...

Java安全 反序列化(1) URLDNS链原理分析

Java安全 反序列化(1) URLDNS链原理分析 文章目录 Java安全 反序列化(1) URLDNS链原理分析前置知识应用分析payload1.新建HashMap类2.新建URL类3.获取URL 的 Class对象4.通过反射访问URL内部变量5.通过反射为URL中类赋值6.调用HashMap#put方法传入key和value7.再次通过反射为UR…...

电脑插上网线之后仍然没网络怎么办?

前言 有小伙伴在使用Windows系统的时候&#xff0c;经常会遇到电脑没网络&#xff0c;但又不知道具体怎么调整才好。 本篇内容适合插网线和使用Wi-Fi的小伙伴&#xff0c;文章本质上是重置电脑的网络设置。 注意事项&#xff1a;网络重置操作会让已连接过的wifi密码丢失&…...

easyexcel读和写excel

请直接看原文: JAVA使用easyexcel操作Excel-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 之前写过一篇《JAVA操作Excel》&#xff0c;介绍了jxl和poi读写Excel的实现&am…...

路由器级联

目录 一、实现功能二、实现步骤2.1 接线步骤 三、效果3.1 常规连接3.2 路由器级联 一、实现功能 主路由器&#xff1a;可有WiFi功能&#xff0c;LAN口下接各设备&#xff0c;并接一个辅路由器辅路由器&#xff1a;开启WiFi功能&#xff0c;有线或无线下接各设备功能&#xff1…...

CentOS7使用Docker部署.net Webapi

1 准备WebApi项目 对于已存在的WebApi项目&#xff0c;需要添加Docker支持&#xff1b; 编码时&#xff0c;先设置好项目需要的端口号&#xff1a;program.cs中&#xff0c;app.Run("http://*:8000");设置端口为&#xff1a;8000在VS中&#xff0c;选中项目&#xf…...

Windows程序员用MAC:初始设置(用起来像win一些)

初级代码游戏的专栏介绍与文章目录-CSDN博客 初用Mac会有很多不习惯&#xff0c;特别是鼠标滚轮的滚动方向和windows是反的&#xff0c;还好是通过设置改变的。下面是我自己的设置。 目录 一、显示器设置 二、屏保、时钟、触发角 三、程序坞与菜单栏 四、安全性与隐私 五…...

基于深度学习YOLOv8+Pyqt5的工地安全帽头盔佩戴检测识别系统(源码+跑通说明文件)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;318安全帽 获取完整源码源文件7000张已标注的数据集训练好的模型配置说明文件 可有偿59yuan一对一远程操作配置环境跑通程序 效果展示&#xff08;图片检测批量检测视频检测摄像头检测&#xff09; 基于深度学习YOLOv8Pyqt…...

csv编辑器是干什么的?

csv编辑器是一种用于编写、编辑和管理文本文件的工具。适用于 JetBrains IDE 系列的 CSV 编辑器插件&#xff0c;此插件将 CSV&#xff08;逗号分隔值&#xff09;作为一种语言引入 Jetbrains IDE&#xff0c;其中包含语法定义、结构化语言元素和关联的文件类型 &#xff08;.c…...

计算机网络——物理层(奈氏准则和香农定理)

计算机网络——物理层&#xff08;奈氏准则和香农定理&#xff09; 失真码间串扰奈氏准则&#xff08;奈奎斯特定理&#xff09;极限数据率 噪声信噪比香农定理奈氏准则和香农定理的区别 前面我们已经了解一些数据通信的基本知识&#xff0c;没有看过上一篇得小伙伴可以点击这里…...

XML语言的学习记录3-解析

学习笔记&#xff1a; 一、 解析XML文档&#xff1a; 1.使用 XMLHttpRequest 对象&#xff0c;将xml文档放入XML DOM对象中&#xff1a; xmlhttpnew XMLHttpRequest(); xmlhttp.open("GET","books.xml",false); xmlhttp.send(); xmlDocxmlhttp.response…...

【Linux】cat vim 命令存在着什么区别?

Linux 中的 cat 命令和 vim 命令之间存在一些显著的区别&#xff01; cat 命令 首先&#xff0c;cat命令主要用于连接并显示文件的内容。它的原含义是“连接&#xff08;concatenate&#xff09;”&#xff0c;可以将多个文件的内容连接起来&#xff0c;并输出到标准输出流中&…...

MeterSphere和Jmeter使用总结

一、MeterSphere 介绍 MeterSphere 是⼀站式开源持续测试平台&#xff0c;涵盖测试跟踪、接⼝测试、UI 测试和性能测试等&#xff0c;全 ⾯兼容 JMeter、Selenium 等主流开源标准&#xff0c;能够有效助⼒开发和测试团队在线共享协作&#xff0c;实现端到 端的测试管理跟踪…...

学习笔记Day8:GEO数据挖掘-基因表达芯片

GEO数据挖掘 数据库&#xff1a;GEO、NHANCE、TCGA、ICGC、CCLE、SEER等 数据类型&#xff1a;基因表达芯片、转录组、单细胞、突变、甲基化、拷贝数变异等等 常见图表 表达矩阵 一行为一个基因&#xff0c;一列为一个样本&#xff0c;内容是基因表达量。 热图 输入数据…...

做网站域名是什么意思/百度还原

在学习AllEmpty大神的从零开始编写自己的C#框架系列文章中&#xff0c;发现的问题&#xff1a;在验证码的缓存Session["vcode"]的赋值时&#xff0c;发现Session["vcode"]的值一直为null。 发现原来是在调用验证码生成类给Session["vcode"]赋值时…...

西部数码网站管理助手3.0/seo变现培训

数据分析在各个领域都有所运用。所处的领域不同&#xff0c;使用的技术工具和分析方法也会有所不同。大家最关心应该就是数据分析前景怎么样&#xff1f;&#xff0c;企业什么时候会用到数据分析&#xff1f; 今天&#xff0c;我们就一起聊一聊企业是如何运用数据分析&#xf…...

做平团的网站/百度官方网平台

在ASP.NET MVC 无需Web Form和Report Viewer 预览SSRS报表解决方案参考文章&#xff1a; &#xff08;1&#xff09;在ASP.NET MVC 无需Web Form和Report Viewer 预览SSRS报表解决方案 &#xff08;2&#xff09;https://www.cnblogs.com/unruledboy/archive/2013/06/07/ASPN…...

河南专业网站建设公司推荐/百度输入法下载

租赁系统 租赁系统&#xff1a;用于实际业务人员使用的商城&#xff0c;可支持其完成周转材料及设备的租赁业务。 重点功能简述 需求计划&#xff1a;用于物装租赁的采购需求&#xff0c;可根据租赁需求计划优先进行内部资源匹配。 内部资源匹配&#xff1a;手动匹配&#…...

手机设计菜单制作软件/网页优化方法

18功能&#xff1a;通过函数的递归调用计算阶乘。【1】 power(n-1)*n 【2】 &n 【3】 power(n) 19功能&#xff1a;数组名作为函数参数&#xff0c;求平均成绩。【1】 a 【2】 av 【3】 &sco[i] 【4】 sco20功能&#xff1a;计算个人与各科平均成绩及全班平均成绩&…...

做网站过程/西安竞价托管代运营

前天独身来到广州&#xff0c;希望在广州闯出一片天。刚来到广州都是新的&#xff0c;当时一下火车累得我够呛的&#xff0c;一个大包一个箱子&#xff0c;都很重&#xff0c;背了包的肩膀现在都还痛呢&#xff0c;不过没什么&#xff0c;人总是在压力中成长起来的。今天开始在…...