安卓使用android studio跨进程通信之AIDL
我写这篇文章不想从最基础的介绍开始,我直接上步骤吧.
1.创建服务端
1.1:创建服务端项目:我的as版本比较高,页面就是这样的

1.2:创建AIDL文件,右键项目,选中aidl

aidl名字可以自定义也可以默认

basicTypes是自带的,可以删掉,也可以不删,然后把你自己所需的接口写上去

1.3:创建aidl调用的service:

1.4:根据aidl生成java文件供service调用:点击Rebuild Project等待完成

这个就是生成的java文件

1.5:编辑service,实现aidl的接口:如果没有生成java的话,会找不到IReceiverAidl
package com.howfor.receiverimport android.app.Service
import android.content.Intent
import android.graphics.Bitmap
import android.os.IBinder
import android.util.Logclass MyService : Service() {var catBinder = object: IReceiverAidl.Stub() {override fun basicTypes(anInt: Int,aLong: Long,aBoolean: Boolean,aFloat: Float,aDouble: Double,aString: String?) {Log.e("TAG","basicTypessetTime===========anInt")}override fun setTime(time: Long) {Log.e("TAG","setTime===========$time")}override fun reboot() {Log.e("TAG","reboot===========")adwApi!!.Reboot()}override fun shutdown() {Log.e("TAG","shutdown===========")adwApi!!.ShutDown()}override fun install(fullPath: String?) {Log.e("TAG","install===========$fullPath")}override fun beat(aBoolean: Boolean) {Log.e("TAG","beat===========$aBoolean")}override fun setPower(power: MutableList<String>?) {Log.e("TAG","setPower===========${power!!.size}")}override fun updateFirmware(localFile: String?) {Log.e("TAG","updateFirmware===========${localFile}")}override fun getDeviceId(): String {Log.e("TAG","getDeviceId===========")return ""}override fun getName(): Array<String> {Log.e("TAG","getName()===========")val arrayEmpty = emptyArray<String>()return arrayEmpty}override fun getPath(): Array<String> {Log.e("TAG","getPath()===========")val arrayEmpty = emptyArray<String>()return arrayEmpty}override fun shouldClean(path: String?): Boolean {Log.e("TAG","shouldClean()===========")return true}override fun getBitmap(): Bitmap {Log.e("TAG","getBitmap()===========")var bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888)return bitmap}override fun getVersion(): String {Log.e("TAG","getVersion()===========")return ""}}override fun onBind(intent: Intent): IBinder {return catBinder}
}
1.6:设置service的属性:name会在客户端绑定使用到,所以我们会先自定义一个,不需要跟着你的Myservice一样
<serviceandroid:name=".MyService"android:exported="true"><intent-filter><action android:name="com.howfor.receiver.service.ReceiverService" /></intent-filter></service>
2.客户端使用:
2.1:创建客户端项目

2.2:复制服务端的aidl到客户端中:必须一模一样的,建议直接复制粘贴
2.3:生成java文件,与服务端1.4一样的步骤:

2.4:使用aidl并且绑定服务端的service:这里的com.howfor.receiver.service.ReceiverService就是1.6设置的属性,包名就是服务端的包名:
package com.example.aidlkhuteimport android.annotation.SuppressLint
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.os.Bundle
import android.os.IBinder
import android.os.RemoteException
import android.util.Log
import android.widget.Button
import androidx.appcompat.app.AppCompatActivityimport com.howfor.receiver.IReceiverAidlclass MainActivity : AppCompatActivity() {var mIReceiverAidl: IReceiverAidl? = nullvar mConnections = object : ServiceConnection {override fun onServiceConnected(name: ComponentName?, service: IBinder?) {Log.e("TAG", "onServiceConnected")//注释3:mIReceiverAidl = IReceiverAidl.Stub.asInterface(service)}override fun onServiceDisconnected(name: ComponentName?) {Log.e("TAG", "onServiceDisconnected")mIReceiverAidl = null}}@SuppressLint("MissingInflatedId")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val intent = Intent()intent.setPackage("com.howfor.receiver")intent.action = "com.howfor.receiver.service.ReceiverService"try {var se = bindService(intent, mConnections, Context.BIND_AUTO_CREATE)Log.e("TAG", "se=========$se")} catch (e: RemoteException) {Log.e("TAG", "e=========${e.message}")}}override fun onDestroy() {super.onDestroy()unbindService(mConnections)}
}
添加两个按钮使用里面的接口
findViewById<Button>(R.id.test).setOnClickListener {if (mIReceiverAidl != null) {try {mIReceiverAidl!!.reboot()} catch (e: RemoteException) {Log.e("TAG", "e=========${e.message}")}} else {Log.e("TAG", "mIReceiverAidl====null")}}findViewById<Button>(R.id.test1).setOnClickListener {if (mIReceiverAidl != null) {try {mIReceiverAidl!!.shutdown()} catch (e: RemoteException) {Log.e("TAG", "e=========${e.message}")}} else {Log.e("TAG", "mIReceiverAidl====null")}}
先运行服务端,可以不用做任何操作,然后再运行客户端,点击对应的接口,就会打印出对应的log:
se=========true //代表服务绑定成功
reboot=========== //点击第一个按钮打印
shutdown=========== //点击第二个按钮打印
还有个小问题:在高版本(targetSdk 33)上会出现绑定失败的情况,然后查看了一下,在安卓11以上,google对系统做了一些操作,具体的可以自行百度:解决方案,在客户端添加红框中的内容即可

相关文章:
安卓使用android studio跨进程通信之AIDL
我写这篇文章不想从最基础的介绍开始,我直接上步骤吧. 1.创建服务端 1.1:创建服务端项目:我的as版本比较高,页面就是这样的 1.2:创建AIDL文件,右键项目,选中aidl aidl名字可以自定义也可以默认 basicTypes是自带的,可以删掉,也可以不删,然后把你自己所需的接口写上去 1.3:创建…...
RabbitMQ基础篇 笔记
RabbitMQ 余额支付 同步调用 一步一步的来,支付业务写完后,如果之后加需求,还需要增加代码,不符合开闭原则。 性能上也有问题,openfeign是同步调用,性能太差。 同步调用耦合太多。 同步的优势是可以立…...
实践小记—静态成员的使用注意(或许由此产生的不知名Bug)
序言 在实际生产过程中,为了便于调用,static修饰的成员会比较容易出现。 如果后期该变量并不会被修改,可以考虑使用。但如果后期需要被修改,使用该变量修饰符则需要慎重考虑。 尤其是在对硬件控制的实际生产中,更需…...
华为OD 身高体重排序(100分)【java】A卷+B卷
华为OD统一考试A卷B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入ÿ…...
在Word中,图片显示不全
在今天交作业的时候,发现了一个非常SB的事情,把图片复制过去显示不完全: 使用文心一言查看搜索了一下,发现可能是以下几种原因: 图片所在行的行高设置不正确。可以重新设置行高,具体步骤包括打开图片显示…...
C++数据结构X篇_20_选择排序
文章目录 1. 选择排序原理2. 选择排序原理核心代码3. 选择排序时间消耗 1. 选择排序原理 选择排序:相对于冒泡排序,减少了交换次数,下图展示了选择排序的原理,具体仍需要结合代码分析。 2. 选择排序原理核心代码 //选择排序 v…...
华为OD技术面试-最短距离矩阵(动态规划、广度优先)
背景 记录2023-10-21 晚华为OD三面的手撕代码题,当时没做出来,给面试官说了我的想法,评价:解法复杂了,只是简单的动态规范 或 广度优先算法,事后找资料记录实现方式。 题目 腐烂的橘子 问题描述ÿ…...
【代码规范】switch 块级的作用域问题
代码规范的一些事儿 问题 今日 Git 提交代码时,出现报错: error Unexpected lexical declaration in case block no-case-declarations 解决过程 我马上就去百度,就找到了这篇文章:解决 Unexpected lexical declaration in ca…...
PHP 基础/练习
练习 成绩定级 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>成绩定级脚本</title> </…...
TCP协议与UDP协议
UDP协议 UDP协议端的格式 16位UDP长度,表示整个数据报(UDP首部UDP数据)的最大长度;如果校验和出错,就会直接丢弃; UDP的特点 UDP传输过程类似寄信 无连接 知道对端的IP和端口号就直接进行传输,不需要建立连接; 不可靠 没有任何安全机制,…...
极智嘉(Geek+)柔性货箱到人拣选方案,助力Starlinks实现高效运营
近些年,电商业务席卷全球,一众企业蓬勃发展。比如沙特阿拉伯先进的物流与供应链解决方案供应商Starlinks的电子商务的销售额从6%增长到了23%。为满足日益增长的国际电商业务需求,以及订单交付时效性更高的要求,Starlinks与全球仓储…...
Hadoop3教程(三十一):(生产调优篇)异构存储
文章目录 (157)异构存储概述概述异构存储的shell操作 (158)异构存储案例实操参考文献 (157)异构存储概述 概述 异构存储,也叫做冷热数据分离。其中,经常使用的数据被叫做是热数据&…...
网络协议--UDP:用户数据报协议
11.1 引言 UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联…...
vscode摸鱼插件开发
不知道大家在写代码的时候,摸不摸鱼,是不是时不时得打开一下微博,看看今天发生了什么大事,又有谁塌房,而你没有及时赶上。 为此,我决定开发一个vscode插件,来查看微博热搜 插件名称࿱…...
音频录制和处理软件 Audio Hijack mac中文版说明
Audio Hijack mac是一款功能强大的音频录制和处理软件,它可以帮助用户从各种来源捕获和处理音频。 首先,Audio Hijack具有灵活的音频捕获功能。它支持从多个来源录制音频,包括麦克风、应用程序、网络流媒体、硬件设备等等。你可以选择捕获整个…...
寻找二叉树一个节点的后继节点
后继节点:中序遍历的后一个节点 普通二叉树:中序遍历得到一个list,时间复杂度O(n) 本题的二叉树:有父节点的指针,后继节点与原节点的距离为1,因此可以直接通过父节点找到下一个节点 优化:节点…...
如何能够获取到本行业的能力架构图去了解自己的能力缺陷与短板,从而能清晰的去弥补差距?
如何能够获取到本行业的能力架构图去了解自己的能力缺陷与短板,从而能清晰的去弥补差距? 获取并利用能力架构图(Competency Model)来了解自己在特定行业或职位中的能力缺陷和短板,并据此弥补差距,是一个非常…...
红队打靶:Misdirection打靶思路详解(vulnhub)
目录 写在开头 第一步:主机发现与端口扫描 第二步:Web渗透(80端口,战术放弃) 第三步:Web渗透(8080端口) 第四步:sudo bash提权 第五步:/etc/passwd利…...
10.23归并排序
课上 归并排序 最大时,就是两个都是完全倒序,但注意一定有一个序列先用完,此时剩一个序列只有一个元素,不用比较,直接加入,所以就是nn-1, 最小时,是都是完全有序,且一个序列中的元…...
[C++]:2初识C++(auto) + 类和对象上:
[TOC](初识C(auto) 类和对象上) 一.初始C 1.auto关键字:(C11) 1.作为一个变量的类型给这个类型初始化,auto自动识别初始化这个变量值的类型,为auto类型的这个变量开辟一个合适的空间。 补充: 1.typeid(变量名).name—>可以打…...
Flowable 实战:从零构建 Spring Boot 3 微服务审批系统
1. 为什么选择Flowable构建审批系统? 在开发企业级应用时,审批流程是绕不开的核心功能。传统硬编码的审批逻辑往往面临流程变更困难、状态追踪复杂等问题。我经历过一个报销系统升级项目,仅仅因为增加了副总经理审批环节,就导致整…...
【JavaScript高级编程】拆解函数流水线 上郴
一、什么是setuptools? setuptools 是一个用于创建、分发和安装 Python 包的核心库。 它可以帮助你: 定义 Python 包的元数据(如名称、版本、作者等)。 声明包的依赖项,确保你的包能够正确运行。 构建源代码分发包&…...
Unity游戏翻译终极指南:XUnity.AutoTranslator一键实现多语言支持
Unity游戏翻译终极指南:XUnity.AutoTranslator一键实现多语言支持 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator是一款专为Unity游戏设计的自动翻译工具,能…...
MediaPipe人体姿态识别避坑指南:从环境配置到模型调优
MediaPipe人体姿态识别避坑指南:从环境配置到模型调优 人体姿态识别技术正在重塑人机交互的边界——从虚拟健身教练的实时动作纠正,到影视特效中的精准动作捕捉,这项技术正在多个领域展现惊人潜力。作为Google推出的跨平台解决方案࿰…...
我的个人AI知识管家:用DeepSeek R1和ChromaDB给本地文档做个“搜索引擎”
我的个人AI知识管家:用DeepSeek R1和ChromaDB给本地文档做个"搜索引擎" 1. 为什么你需要一个私人知识库? 每天我们都在处理海量的信息——工作文档、学习笔记、技术资料、会议记录...这些散落在电脑各处的文件就像一座未经开采的金矿。你是否遇…...
百元挂耳式耳机哪款音质好?带你弄懂最值得购买的十大开放式耳机
现在市面上有些牌子,价格标得挺高,体验却跟不上;还有些走低价路线的网红款,看着参数漂亮,实际到手一用——耳挂硬得硌耳朵,声音飘得像隔层纱,用不了几个月就开始出毛病。这种产品,买…...
被“圈养”的Java开发者:当AI浪潮来袭,你还在用手写HttpClient调大模型吗?
写在前面 2026年,AI早已不是算法工程师的专属领域。每个后端开发者都被卷入了这场浪潮——无论你愿不愿意。 “两年前,大部分Java团队面对大模型浪潮的反应是:‘我们用HTTP调OpenAI的API不就行了?’” 但到了2026年,如…...
Unity新手避坑指南:从零搭建第一个3D场景,我踩过的那些坑都帮你填好了
Unity新手避坑指南:从零搭建第一个3D场景的实战经验 第一次打开Unity时,那个空荡荡的3D场景窗口既令人兴奋又让人不知所措。作为一个过来人,我清楚地记得自己是如何在无数个深夜与各种"坑"作斗争的。这篇文章不是又一篇基础操作手…...
Agent 在招投标场景能解决哪些问题?——2026年招投标数智化转型深度解析
站在2026年4月的节点回望,招投标行业正经历着自“电子化交易”以来最深刻的一场变革。随着《关于加快招标投标领域人工智能推广应用的实施意见》等政策的落地,AI Agent(智能体)已不再是实验室里的概念,而是成为了重构招…...
SpringAI 1.0.0 实战:用阿里百炼平台免费额度,5分钟搞定你的第一个AI对话接口
SpringAI 1.0.0实战:零成本搭建AI对话接口的完整指南 最近在技术社区里看到不少开发者对AI应用开发跃跃欲试,但往往被高昂的API调用成本劝退。作为一个经历过同样困扰的开发者,我发现阿里百炼平台提供的免费额度简直是成本敏感型开发者的福音…...

