AndroidStudio AIDL 示例代码详细步骤

2023-11-03

AIDL (Android Interface Definition Language)即Android接口定义语言。

最近在看Binder的原理,Android里面AIDL就是Binder的经典实现,先记录一下AIDL的使用步骤。

1 服务端Service

1.1 使用AndroidStudio创建aidl文件

然后弹出一个让你修改文件名的页面,文件名自己随便取

点Finish以后aidl文件目录如下图:

然后打开aidl文件夹目录并打开刚刚创建的 OperateNumInterface.aidl 文件:

其中NumBean是自己新建的一个java类,目录如下

NumBean一定要实现 Parcelable接口,完整代码如下

package com.sz.aidl_service_demo;
 
import android.os.Parcel;
import android.os.Parcelable;
 
public class NumBean implements Parcelable {
 
    private String extraInfo;
    private int num1;
    private int num2;
 
 
    public NumBean(int num1, int num2, String extraInfo) {
        this.num1 = num1;
        this.num2 = num2;
        this.extraInfo = extraInfo;
    }
 
    protected NumBean(Parcel parcel) {
        num1 = parcel.readInt();
        num2 = parcel.readInt();
        extraInfo = parcel.readString();
    }
 
    public String getExtraInfo() {
        return extraInfo;
    }
 
    public void setExtraInfo(String extraInfo) {
        this.extraInfo = extraInfo;
    }
 
    public int getNum1() {
        return num1;
    }
 
    public void setNum1(int num1) {
        this.num1 = num1;
    }
 
    public int getNum2() {
        return num2;
    }
 
    public void setNum2(int num2) {
        this.num2 = num2;
    }
 
    public static final
    Creator<NumBean> CREATOR = new Creator<NumBean>() {
 
        @Override
        public NumBean createFromParcel(Parcel source) {
            return new NumBean(source);
        }
 
        @Override
        public NumBean[] newArray(int size) {
            return new NumBean[size];
        }
    };
 
    @Override
    public int describeContents() {
        return 0;
    }
 
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(num1);
        dest.writeInt(num2);  
        dest.writeString(extraInfo);
    }
}
然后在aidl文件夹下创建NumBean.adil文件,内容如图

这时候你需要rebulid一下项目,用来生成OperateNumInterface.java文件,build成功以后会有如下目录:

​​

 

1.2 创建Service实现类

创建一个类实现Service,位置目录如下

OperateNumService.java详细代码:

package com.sz.aidl_service_demo;
 
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
 
import androidx.annotation.Nullable;
 
public class OperateNumService extends Service {
 
                          注释1:一定要先ReBuild项目,否则找不到OperateNumInterface  
    private IBinder iBinder = new OperateNumInterface.Stub() {
 
        @Override
        public int operateNum(NumBean numBean) throws RemoteException {
                注释2:还记得aidl文件中我们自己定义的方法么,具体实现在这里
            Log.i("tag", "num1=" + numBean.getNum1() + ",num2=" + numBean.getNum2() + ",ExtraInfo=" + numBean.getExtraInfo());
            return numBean.getNum1() + numBean.getNum2();//我是将NumBean中两个数的和返回
        }
    };
 
 
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return iBinder;
    }
}

然后别忘了在Mainfest文件中声明Service:

<service android:name=".OperateNumService">
            <intent-filter>
                <action android:name="com.aidl_service_demo.my_flag" />
            </intent-filter>
        </service>

到这里服务端就写好了。

2 客户端Client

2.1 将服务端的aidl文件夹整个直接复制到Client目录中

2.2 新建NumBean类

注意,NumBean类的目录要和Service端的目录结构一样

注意,你需要ReBuild项目一下

2.3 绑定Service及发送数据接收返回结果

这些操作都是在MainActivity 中进行,代码如下:

import androidx.appcompat.app.AppCompatActivity;
 
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.view.View;
import android.widget.TextView;
 
import com.sz.aidl_service_demo.NumBean;
import com.sz.aidl_service_demo.OperateNumInterface;
 
public class MainActivity extends AppCompatActivity {
 
    private TextView tv_operate_num_result;
    private int operateResult = -1;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_operate_num_result = findViewById(R.id.tv_operate_num_result);
    }
    
    注释1:按钮1 绑定Service
    public void bindService(View view) {
        Intent intentBind = new Intent();
        intentBind.setAction("com.aidl_service_demo.my_flag");
        intentBind.setPackage("com.sz.aidl_service_demo");
        bindService(intentBind, serviceConnection, Context.BIND_AUTO_CREATE);
    }
 
    注释2:按钮2Service发送数据并接收返回数据展示
    public void sendService(View view) {
        NumBean numBean = new NumBean(160, 8, "i'm extra info");
        if (operateNumInterface != null) {
            try {
                operateResult = operateNumInterface.operateNum(numBean);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
        tv_operate_num_result.setText("Service 返回操作结果为: " + operateResult);
    }
 
    private OperateNumInterface operateNumInterface;
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.i("tag", "onServiceConnected");
            注释3: 
            operateNumInterface = OperateNumInterface.Stub.asInterface(service);
        }
 
        @Override
        public void onServiceDisconnected(ComponentName name) {
            operateNumInterface = null;
        }
    };
}

1 先点击绑定Service按钮,此时客户端打印日志如下:

2 再点击 发送数据到Service 按钮

Service端日志如下:

Client端界面展示如下:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AndroidStudio AIDL 示例代码详细步骤 的相关文章

  • Spring Data JPA 规范继承

    我有三个实体 如下所示 Entity Inheritance strategy InheritanceType JOINED DiscriminatorColumn name type public abstract class Emplo
  • 从设备获取日期并将其转换为 GMT+4

    我正在尝试查找 Android 手机的时区 因为我想获取日期对象 但我想要 GMT 4 格式 我看到的所有其他答案都会转换来自 API 请求的时间 其时区已知 我怎样才能做到这一点 其他方法可能是将服务器传来的 GMT 4 时间转换为我设备
  • Java写入ByteArrayOutputStream内存泄漏

    我正在将图像字节写入ByteArrayOutputStream然后通过套接字发送它 问题是 当我这样做时 ImageIO write image gif byteArray 内存增加很多 有点内存泄漏 我用这个发送 ImageIO writ
  • 自动装箱是否调用 valueOf()?

    我试图确定以下陈述是否保证为真 Boolean true Boolean TRUE Boolean true Boolean valueOf true Integer 1 Integer valueOf 1 我一直认为自动装箱相当于调用va
  • 将 Dagger 与 Espresso 一起使用

    我计划在我的应用程序多模块上创建 Espresso 测试 并且我即将创建第一个 Espresso 测试 但我看到的是 在我的应用程序上我没有AppComponent我可以在哪里伪造它 由于我想在我的功能模块上添加测试 我将创建TestApp
  • 识别包含本机方法实现的库文件/源

    如何识别包含本机方法实现的库文件 Ex public native String intern 我在哪里可以找到实施 source code of String intern 方法 找到了答案String intern 与快速谷歌搜索 ht
  • Gradle 警告:不推荐使用variant.getOutputFile() 和variant.setOutputFile()

    我在 Android 应用程序项目中使用以下简化配置 android compileSdkVersion 20 buildToolsVersion 20 0 0 defaultConfig minSdkVersion 8 targetSdk
  • JRuby调用了错误的方法

    我在调用 Java 方法时遇到了一个奇怪的问题JRuby http en wikipedia org wiki JRuby 在我的 Java 类中 这些方法定义了两次 看来 JRuby 调用了错误的方法 所以我尝试使用java method
  • Android 中的 SeekBar setMin 至少需要 api 26?

    我想在我的 Android 应用程序中使用 SeekBar 我的minsdk版本必须是23 编译器说SeekBar的setMin至少需要API级别26 我是否需要一些特殊的支持库来实现简单的 SeekBar setMin 我在 Linux
  • 方法中缺少 return 语句错误

    我正在尝试编写一个返回计算机 MAC 地址字符串的静态方法 该函数本身可以在此处找到 http www mkyong com java how to get mac address in java http www mkyong com j
  • 在java中访问dll方法

    我正在尝试访问java中用c 编写的dll方法 从下面的代码我试图构建已成功生成的 dll using System using Microsoft Win32 namespace CyberoamWinHelper public clas
  • 是否可以通过 MediaRecorder 或其他类获取当前样本幅度

    我有一个媒体录音机 想要从麦克风录制媒体并获取 它是幅度样本 我想尝试立即获得正确的当前幅度 当调用一些API时 但 MediaRecorde 中只有一个 API 用于获取幅度 getMaxAmplitude 用于获取最大绝对幅度 自上次调
  • Android 位图内存问题 - 错误:8294416 字节分配内存不足

    我目前正在开发一个讲述故事的应用程序 该故事包含 场景 其中包含通过 ImageView 显示的多个 JPEG 和 PNG 文件 我创建 ImageView 并通过以下函数将其添加到布局中 private ImageView newImag
  • 如何为Android编译最新的FFmpeg库?

    努力将当前 FFmpeg 的工作和一般最佳实践构建在一起 似乎没有最新的文档或教程 现有的内容充满了过时的链接或不起作用的构建脚本 构建独立的 NDK 工具链 下载最新的NDK并运行make standalone toolchain py
  • 将文本文件写入 SD 卡失败

    我遇到了一个奇怪的问题 我的应用程序可以将一个简单的文本文件写入 SD 卡 有时它对某些人有效 但对其他人无效 我不知道为什么 对于某些人来说 如果他们输入一些字符 例如 在文件等中 我似乎无法重现它 因为我没有遇到任何麻烦 但这是处理文件
  • 设置android中按钮的透明度

    我想在android中制作具有不同透明度级别的按钮 我使用过 android color transparent 但它使按钮 100 透明 我需要一个 70 透明的按钮 这是我正在处理的 XML 代码
  • JPA2+Hibernate 3.6.0 中的 JTA 还是 LOCAL 事务?

    我们正在重新思考我们的技术堆栈 以下是我们的选择 由于应用程序的复杂性等 我们不能没有 Spring 和 Hibernate 我们还从 J2EE 1 4 迁移到 Java EE 5 技术栈 Java EE 5 JPA 2 0 我知道Java
  • 解决SecurityException:权限拒绝:启动意图。我需要什么许可?

    我想从应用程序打开游戏商店 在三星手机上还好 但在一加手机上却失败了 我不知道在哪里alibaba来自 真奇怪 异常 java lang SecurityException 权限拒绝 启动意图 act android intent acti
  • Java:当计时器处于活动状态时,JSplitPane 将顶部面板的内容复制到底部面板

    所以我有一个 JSplitPane 和两个 JPanel 一个在顶部 一个在底部 在这两个面板中 我重写了paintComponent方法并添加了我自己的图形 在底部面板中 我想添加动画 当面板不重新绘制时 这很好 但是一旦计时器 java
  • JFrame.repaint() 和 JPanel.repaint() 之间的区别

    谁能解释一下两者之间的区别JPanel repaint 方法和JFrame repaint 方法 我想两者都调用paintComponent JPanel 中的方法 请澄清 谢谢 Calling repaint 在任何组件上都会向重绘管理器

随机推荐

  • Linux Select

    文章目录 1 函数原型 1 1 函数参数说明 1 2 返回值 2 相关数据结构与函数 2 1 struct timeval 2 2 fd set 3 编程模型 4 关于select的阻塞 4 select总结 5 Unix5中IO模型 5
  • 服务器不稳定怎么解决?常见的4种问题和6种处理方法

    一 常见的4种问题 1 机房或服务器问题 联系服务器提供商 要求协助排查故障并解决或者更换硬件 2 软件和硬件故障故障问题 要求服务商更换服务器 或者升级服务器 3 网站本身问题 通过优化网站结构 减少垃圾代码等方式来优化网站访问速度 4
  • flutter dart判断文件是否存在

    File txt File data data sms com smsexample files 2 txt var dir bool await txt exists 返回真假 if dirbool
  • css3 flex 实现常见页面布局

    css3 flex 实现常见页面布局 上中下布局 左中右三列布局 圣杯布局 Flex是Flexible Box的缩写 意为 弹性布局 用来为盒状模型提供最大的灵活性 任何一个容器都可以指定为Flex布局 box display flex 行
  • 云服务器被ddos攻击了怎么办?甜甜来给您解答

    随着互联网科技的发展 网络安全问题日益突出 企业服务器被攻击的事件也越来越频繁 为此快快推出的增值服务高防ip 有效解决了中小企业DDOS攻击问题 同时快快高防ip支持大流量按天付费模式 可按不同业务需求配置弹性防护 成本可控 互联网服务器
  • ansible错误解决:UNREACHABLE Failed to connect to the host via ssh.

    执行过程是 ansible接收动态的hosts与本地的私钥 通过无密码登录方式运行一个playbook 但是运行后始终出现如下问题 PLAY 120 27 26 TASK setup 1 31mfatal 120 27 26 UNREACH
  • Win10系统BitLocker解锁后再次快速锁定办法

    谁都不愿意把自己电脑上资料完全公开 对资料选择性加密处理是唯一的办法 微软Windows7及以后的Windows系统自带磁盘分区BitLocker加密功能是一个不错的选择 BitLocker加密功能的优点之一是可以对磁盘分区进行快速加密 锁
  • jsp不能正常引入jquery($ is not defined)问题分析

    文章目录 1 idea中不能引入jquery step1 step2 2 路径导入问题 3 静态文件不能放在WEB INF下 4 finally jsp中不能正常引入jquery的原因有很多 让我们一步一步来排除 1 idea中不能引入jq
  • 华为面试题: 招聘(javascript)

    题目 某公司组织一场公开招聘活动 假设由于人数和场地的限制 每人每次面试的时长不等 并已经安排给定 用 S1 E1 S2 E2 Sj Ej Si lt Ei 均为非负整数 表示每场面试的开始和结束时间 面试采用一对一的方式 即一名面试官同时
  • 命令行说明中括号的含义

    内的内容表示可写可不写 至少选择大括号内的一个 lt gt 必写项
  • QT删除及创建文件夹

    bool DirMake const QString path QString full path GetFullPath path QDir dir full path if dir exists return true else ret
  • 2022-2023 通信工程专业毕业设计题目选题推荐 - 100例

    文章目录 1前言 2 如何选题 3 通信工程选题方向 2 1 移动通信方向 2 2 嵌入式开发方向 2 3 人工智能方向 2 4 物联网方向 2 5 算法研究方向 2 6 移动应用开发方向 2 7 网络通信方向 3 4 学长作品展示 4 最
  • 二维码PDF417简介及其解码实现(zxing-cpp)

    二维码PDF417是一种堆叠式二维条码 PDF417条码是由美国SYMBOL公司发明的 PDF Portable Data File 意思是 便携数据文件 组成条码的每一个条码字符由4个条和4个空共17个模块构成 故称为PDF417条码 P
  • 【C#学习笔记】数组使用

    using System namespace ConsoleApplication class Program static void Main string args int a new int 3 一维数组 int a new int
  • 如何通过cpolar内网穿透+VNC实现公网远程ubuntu

    文章目录 前言 1 ubuntu安装VNC 2 设置vnc开机启动 3 windows 安装VNC viewer连接工具 4 内网穿透 4 1 安装cpolar 支持使用一键脚本命令安装 4 2 创建隧道映射 4 3 测试公网远程访问 5
  • 毕业设计-基于协同过滤算法的电商平台推荐系统

    目录 前言 课题背景和意义 实现技术思路 一 文献综述 二 基于用户协同过滤推荐系统算法 三 实证分析 四 总结 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计
  • mysql DATE_FORMAT导致索引失效

    最近在优化一个统计的接口 在几十万的数据统计下 接口处理的响应时间达到了20s 看了下代码逻辑 发现其中主要有三个主要的统计方法 在优化了其中一个方法的统计逻辑后 接口的响应时间下降到了3s内 还是没有达到期望的响应时间 1s内 看了下另外
  • 决策树——依据水果特征分类

    文章目录 一 获取数据集 1 提取数据 2 划分数据 二 计算信息增益 1 信息熵 2 计算信息增益 三 绘制决策树 四 分类预测 一 获取数据集 水果中苹果和杨桃外部特征比较鲜明 例如下面两张苹果 杨桃图片 苹果颜色为红色 形状大致为椭圆
  • 优化代码逻辑之 K-近邻算法之鸢尾花实例 使用Spark实现KNN的Demo2

    这篇代码是KNN的优化 代码就是 flatMap里面的结构转换 和aggregate的应用感觉有点难理解 但是思想简单 首先要知道这个优化是基于 有个大数据的思想 分而治之 求出一份数据最大的前一百个数 如果数据太多 内存太小 则将数据切割
  • AndroidStudio AIDL 示例代码详细步骤

    AIDL Android Interface Definition Language 即Android接口定义语言 最近在看Binder的原理 Android里面AIDL就是Binder的经典实现 先记录一下AIDL的使用步骤 1 服务端S