A-【项目开发知识管理】Android AIDL跨进程通信

Android AIDL跨进程通信

文章目录

  • Android AIDL跨进程通信
    • 0.我为啥要写这篇文章
    • 1.AIDL是干啥的?
      • 1.1简述
      • 1.2官方话
    • 2.在AndroidStudio中怎么干?
      • 2.1准备工作
      • 2.2在项目A中创建AIDL文件夹
      • 2.3在项目A中创建一个aidl文件
      • 2.4将项目A进行一次Rebuild操作
      • 2.5在项目A中新建一个服务
      • 2.6在项目A的清单文件中配置服务
      • 2.7在项目B中绑定项目A的服务
        • 2.7.1注意
      • 2.8项目B与项目A跨进程通信的重要配置

0.我为啥要写这篇文章

(1)高版本Android系统中,AIDL通信配置上有点变化,不配置进程间通信搞不通。

1.AIDL是干啥的?

1.1简述

简单一句话讲就是两个APP之间如果要谈恋爱,就要靠AIDL来帮着搭桥牵线。

1.2官方话

AIDL是一个缩写,全程是Android Interface Definition Language,也是android接口定义语言。准确的来说,它是用于定义客户端/服务器通信接口的一种描述语言。它其实一种IDL语言,可以拿来生成用于IPC的代码。从某种意义上说它其实是一个模板。为什么这么说?因为在我们使用中,实际起作用的并不是我们写的AIDL代码,而是系统根据它生成的一个IInterface的实例的代码。而如果大家都生成这样的几个实例,然后它们拿来比较,你会发现它们都是有套路的——都是一样的流程,一样的结构,只是根据具体的AIDL文件的不同由细微变动。所以其实AIDL就是为了避免我们一遍遍的写一些前篇一律的代码而出现的一个模板。

2.在AndroidStudio中怎么干?

2.1准备工作

(1)创建好两个APP工程,以下简称项目A、项目B
(2)将项目A作为服务端,即被访问端,意思就是其他项目找项目A谈恋爱。
(3)项目B作为客户端

2.2在项目A中创建AIDL文件夹

在这里插入图片描述

2.3在项目A中创建一个aidl文件

(1)文件名称可以按自己的需求取
(2)文件内容其实就是一个接口,可以按自己的需求定义功能,作用其实就是服务端与客户端都遵循接口规范进行通信。

// IDevToolAidlInterface.aidl
package com.gdc.android.debug;

// Declare any non-default types here with import statements

interface IDevToolAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
}

2.4将项目A进行一次Rebuild操作

(1)点击AndroidStudio的Build菜单,接着点击Rebuild
(2)build完成后,在app\build\generated目录去查看自动生成的接口文件,这个接口文件非常重要,后续可以拷贝到项目B,用来与项目A进行直接通信。

2.5在项目A中新建一个服务

(1)主要用来与项目B建立通信连接,进行数据传递。

public class DevToolService extends Service {
    //(1)app名称
    private static final String APP_NAME = "AppName";
    //(2)崩溃日志文件路径
    private static final String FILEPATH = "FilePath";

    private Binder binder = new IDevToolAidlInterface.Stub() {
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }
    };

    public DevToolService() {

    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
    	//接收项目B传递的数据
        String appName = intent.getStringExtra(APP_NAME);
        String filepath = intent.getStringExtra(FILEPATH);
       
        return binder;
    }
}

2.6在项目A的清单文件中配置服务

(1)即在AndroidManifest.xml中配置服务

<!--
   (1)接收崩溃日志的服务
    a.获取其他应用程序崩溃日志
    b.将崩溃日志传递给QQ,由测试人员转发给软件开发人员
    android:exported="true":表示该服务允许被跨进程使用
-->
<service
	android:name="com.gdc.devtool.service.DevToolService"
	android:enabled="true"
	android:exported="true">
    <intent-filter>
        <action android:name="com.gdc.devtool.service.DevToolService"/>
    </intent-filter>
</service>

2.7在项目B中绑定项目A的服务

(1)在你需要进行跨进程通信的类中绑定项目A的服务,按你需求来,这里只贴绑定部分的代码。

 //(a)把程序崩溃日志通过Devtool服务传给QQ
if (Constant.DEBUG_MODEL) {
    Intent serviceIntent = new Intent();
    serviceIntent.setPackage("com.gdc.devtool");
    serviceIntent.setAction("com.gdc.devtool.service.DevToolService");
    serviceIntent.putExtra(APP_NAME, FilePathManager.getAppFileRootDirectoryName());
    serviceIntent.putExtra(FILEPATH, file.getAbsolutePath());
    ApplicationContext.getContext().bindService(serviceIntent,serviceConnection, ApplicationContext.getContext().BIND_AUTO_CREATE);
}

(2)在ServiceConnection通信边接建立成功后,写你自己需要进行通信的内容。

private static ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //(1)成功连接
            ToastUtil.show("连接成功的业务操作...");            
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            //(2)连接断开
            ToastUtil.show("连接断开后的业务操作...");
        }
    };
2.7.1注意

(1)绑定服务的意图一定要用显示意图,这是高版本Android系统要求的,只是没调查过从哪个版本开始的。
(2)包名指的是项目A的包名,去项目A的AndroidManifest.xml顶上的package中去复制。
(3)action:也是去复制项目A中AndroidManifest.xml中服务的action配置信息。

2.8项目B与项目A跨进程通信的重要配置

(1)在Android高版本系统中,配置了上述信息之后还不够,还需要配置相关的权限
(2)在项目B中的AndroidManifest.xml中配置与项目A进行跨进程通信需要的权限信息

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission"/>

<queries>
	<package android:name="com.gdc.devtool"/>
</queries>

(3)queries主要作用就是设置项目的可见性,即在项目B中可以看见项目A的包
(4)有篇博文里面是这样描述queries的
a.从Android 11 开始 系统对app的可见性进行了保护,只有部分应用可见所有app.
b.queries via package name: 标签表示只有配置了包名 才对该app可见
c.按照package的说法就是,只有配置了项目A的包名,才能看得见项目A,也才能够进行跨进程通信。

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

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

相关文章

visual studio设置修改文件字符集方法

该方法来自网文&#xff0c;特此记录备忘。 添加两个组件&#xff0c;分别是Force UTF-8,FileEncoding。 截图如下&#xff1a; 方法如下&#xff1a;vs中点击“扩展”->“管理扩展”&#xff0c;输入utf搜索&#xff0c;安装如下两个插件&#xff0c;然后重启vs&#xf…

【设计模式系列】观察者模式

一、什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。这种模式也被称为发布-订阅模式&…

matplotlib库

1.概念 Matplotlib 库&#xff1a;是一款用于数据可视化的 Python 软件包&#xff0c;支持跨平台运行&#xff0c;它能够根据 NumPy ndarray 数组来绘制 2D 图像&#xff0c;它使用简单、代码清晰易懂 Figure&#xff1a;指整个图形&#xff0c;您可以把它理解成一张画布&…

【含开题报告+文档+PPT+源码】基于vue框架的东升餐饮点餐管理平台的设计与实现

开题报告 在当前信息化社会背景下&#xff0c;餐饮行业正经历着由传统线下服务模式向线上线下深度融合的转变。随着移动互联网技术及大数据应用的飞速发展&#xff0c;用户对于餐饮服务平台的需求也日益多元化和个性化。他们期望能在一个集便捷、高效、个性化于一体的平台上完…

快速搭建SpringBoot3+Prometheus+Grafana

快速搭建SpringBoot3PrometheusGrafana 一、搭建SpringBoot项目 1.1 创建SpringBoot项目 1.2 修改pom文件配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://…

如何使用 Spring Cloud 实现客户端负载平衡

微服务系统通常运行每个服务的多个实例。这是实施弹性所必需的。因此&#xff0c;在这些实例之间分配负载非常重要。执行此操作的组件是负载均衡器。Spring 提供了一个 Spring Cloud Load Balancer 库。在本文中&#xff0c;您将学习如何使用它在 Spring Boot 项目中实现客户端…

SolarWinds Web Help Desk曝出严重漏洞,已遭攻击者利用

近日&#xff0c;CISA 在其 “已知漏洞”&#xff08;KEV&#xff09;目录中增加了三个漏洞&#xff0c;其中一个是 SolarWinds Web Help Desk (WHD) 中的关键硬编码凭据漏洞&#xff0c;供应商已于 2024 年 8 月底修复了该漏洞。 SolarWinds Web Help Desk 是一款 IT 服务台套…

影刀RPA实战番外:excel函数应用指南

Excel函数是用于执行特定计算、分析和数据处理任务的预定义公式。它们可处理数学计算、文本处理、逻辑判断、日期和时间运算、查找和引用数据等。例如&#xff0c;SUM函数可以计算一系列数字的总和&#xff0c;IF函数进行逻辑测试&#xff0c;VLOOKUP函数在表格中查找数据&…

HTML之表单设计

1、HTML表单 HTML表单是用于收集用户输入的信息&#xff0c;并将用户输入的内容信息传到后台服务器中。 表单是通过form标签实现。 特别注意&#xff1a;如果一些内容提交后&#xff0c;没有将内容提交给后台服务器&#xff0c;那么需要添加一个name属性&#xff0c;语法&am…

鼠标移入盒子,盒子跟随鼠标移动

demo效果&#xff1a; 鼠标移入盒子&#xff0c;按下鼠标,开启移动跟随移动模式,再次按下关闭移动模式 涉及主要属性 在元素上单击鼠标按钮时输出鼠标指针的坐标&#xff1a; var x event.pageX; // 获取水平坐标 var y event.pageY; // 获取垂直坐标元素offsetL…

JDK-23与JavaFX配置在IDEA中

一、安装 1.IDEA安装&#xff0c;可以查看CSDN 2.JDK,JavaFX安装&#xff0c;可以查看CSDN 二、配置JDK 打开IDEA&#xff0c;选择个项目&#xff0c;点击图中的设置按钮&#xff1a; 点击项目设置&#xff1a; 点击“”添加JDK&#xff0c;寻找相应的JDK目录就行 三、配置…

Python快速入门教程

目录 1. Python 简介 2. 环境准备 3. 第一个 Python 程序 4. 变量与数据类型 5. 基本操作与控制结构 6. 函数与模块 7. 实践项目 结语 Python 是一种非常友好的编程语言&#xff0c;特别适合初学者。它的语法简洁&#xff0c;容易上手&#xff0c;并且广泛应用于各种领…

机器视觉运动控制一体机在DELTA并联机械手视觉上下料应用

市场应用背景 DELTA并联机械手是由三个相同的支链所组成&#xff0c;每个支链包含一个转动关节和一个移动关节&#xff0c;具有结构紧凑、占地面积小、高速高灵活性等特点&#xff0c;可在有限的空间内进行高效的作业&#xff0c;广泛应用于柔性上下料、包装、分拣、装配等需要…

从docker中导出已经存在的容器

从docker中导出已经存在的容器,作用:创建一个容器可以给多台电脑的docker使用&#xff0c;不用重复安装环境。 操作步骤&#xff1a; (1)先运行要导出的容器&#xff0c;并在cmd终端使用docker ps 查看运行的详细信息&#xff0c;留意一下 COMMAND对应的值后面运行容器需要使用…

创建匿名管道

匿名管道&#xff1a; pipe()函数可用于创建一个管道&#xff0c;以实现进程间的通信。 头文件是#include<unistd.h>&#xff0c;参数是int类型的数组 fd[0]表示读端 fd[1]表示写端 如下代码使用pipe函数创建管道&#xff0c;并打印出来&#xff0c;最后关闭终端。 #…

力扣 简单 70.爬楼梯

文章目录 题目介绍题解 题目介绍 题解 思路分析&#xff1a; 确定dp数组以及下标的含义&#xff1a;dp[i]&#xff1a; 爬到第i层楼梯&#xff0c;有dp[i]种方法确定递推公式&#xff1a;从dp[i]的定义可以看出&#xff0c;dp[i] 可以有两个方向推出来。首先是dp[i - 1]&…

Springboot基于微信小程序的同城优惠软件的开发-计算机毕设 附源码24287

Springboot基于微信小程序的同城优惠软件的开发 摘要 随着互联网技术的发展&#xff0c;网络购物越来越受到大家的欢迎。电子商务这一概念大家都不在陌生。通过互联网进行的商品贸易范围越来越广泛&#xff0c;从经典的电子商品、到化妆品、书籍等&#xff0c;发展到小吃商品&a…

PCL学习——点云基础

点云基础 一、什么是三维点云二、获取三维点云的几种方式三、主要挑战四、什么是PCL 一、什么是三维点云 三维点云&#xff08;3D Point Cloud&#xff09;是一种用于表示三维空间中对象或场景的数据结构。在最基础的形式中&#xff0c;它是一个包含多个三维坐标点&#xff08…

SpringBoot民宿预定信息管理系统-计算机毕业设计源码89828

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2研究背景 1.3论文结构与章节安排 2 民宿预定信息管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分…

Pytest日志收集器配置

前言 在pytest框架中&#xff0c;日志记录&#xff08;logging&#xff09;是一个强大的功能&#xff0c;它允许我们在测试期间记录信息、警告、错误等&#xff0c;从而帮助调试和监控测试进度。 pytest与Python标准库中的logging模块完美集成&#xff0c;因此你可以很容易地在…