AIDL

原理图:

语法// 包名, 文件必须放在指定的目录

package com.your.package

// 定义接口

interface IRemoteService {

// 定义方法 int getPid(int pid);}

创建 AIDL 文件,并生成 Java 接口类手动

自动

手动创建与 java 同级的目录 aidl

在这个目录下创建和 java 包下一样的包结构

编写 aidl 文件

用 ~/Library/Android/sdk/build-tools/30.0.3/aidl(我自己电脑的路径) 下的 aidl 命令生成 Java 接口文件

自动在 main 目录上点击右键

new -> AIDL : 会自动创建一个 aidl 文件

点击 build -> Make Project 就会生成相应的 Java 接口文件(文件路径:YourProject/app/build/generated/aidl_source_output_dir/debug/out/cn/kk/myaidl/)

完整操作步骤创建 AIDL 文件

生成对应 Java 接口类

定义 Service, 并在 AndroidManifest.xml 中注册

在自定义的 Service 类中定义成员变量 Binder, 并且初始化(实现接口方法)

在自定义的 Service 类的 onBind() 方法中,返回步骤 4 定义的 Binder 对象。

新建客户端的 module, 将服务端的 aidl -> 包名 目录下的所有文件拷贝到客户端 aidl -> 包名(和服务端包名要一样) 目录下

客户端绑定服务端

在客户端调用服务端定义的方法

3. 定义 Service 并注册

在 AndroidManifest.xml 中注册:

android:process=":remote"

android:enabled="true"

android:exported="true">

7. 客户端绑定服务端

步骤 6 操作完,Make Project(在客户端根据 aidl 定义的接口 生成 Java 类)。// 客户端绑定服务端

Intent intent = new Intent();

String aidlPackageName = "cn.kk.myaidl"; // 远程 aidl 的包名

String aidlRemoteServiceName = "cn.kk.myaidl.MyCalculatorService"; // 要绑定的远程服务名

intent.setComponent(new ComponentName(aidlPackageName, aidlRemoteServiceName));

// Context.BIND_AUTO_CREATE 绑定后,服务自动启动

bindService(intent, conn, Context.BIND_AUTO_CREATE);

// 创建成员变量 ServiceConnection conn

private ServiceConnection conn = new ServiceConnection() {

@Override public void onServiceConnected(ComponentName name, IBinder service) {

}

@Override public void onServiceDisconnected(ComponentName name) {

}};

// 定义成员变量: private IMyCalculatorService iMyCalculatorService;

// 在回调方法 onServiceConnected() 里, 初始化 iMyCalculatorService:

private ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

iMyCalculatorService IMyCalculatorService.Stub.asInterface(service);

}

@Override

public void onServiceDisconnected(ComponentName name) {

// 回收资源

iMyCalculatorService = null;

}

};

默认支持的数据类型基本数据类型(不包括 short)

String, CharSequence

List, Map

Parcelable

创建自定义类型的数据(常用)

服务端操作:序列化这个类

创建 Human.aidl 文件

在 AIDL 接口文件中,使用 Human 自定义类型

Make Project

在服务端的 Service 里面实例化接口,重写接口方法, onBind() 里面返回这个实例化对象

2.序列化这个类实现接口:Parcelable

重写方法:describeContents() 和 writeToParcel(Parcel dest, int flags)

writeToParcel() 方法重写:dest.writeString(name); dest.writeInt(age); ...

实例化变量:Creator CREATOR

创建 Human 新的构造方法:

4.实例化变量:Creator CREATORpublic static final Creator CREATOR = new Creator() {

@Override

public Human createFromParcel(Parcel source) {

return new Human(source);

}

@Override

public Human[] newArray(int size) {

return new Human[0];

}

};

5.创建 Human 新的构造方法:public Human(Parcel source) {

// 这个操作顺序一定要和 writeToParcel() 的顺序一致

this.name = source.readString();

this.age = source.readInt();

}

3.创建 Human.aidl 文件

在 aidl 目录中,参照 Human.java 的包名,在对应的路径创建 Human.aidl 文件,内容如下:package cn.kk.myaidl.bean;

parcelable Human;

4.在 AIDL 接口文件中,使用 Human 自定义类型导入自定义类:import cn.kk.myaidl.bean.Human;

定义方法,如:List addHuman(in Human h);

6.在服务端的 Service 里面实例化接口,重写接口方法private IBinder iHumanBinder = new IHumanInterface.Stub() {

@Override

public List addHuman(Human h) throws RemoteException {

humanArrayList.add(h);

return humanArrayList;

}

};

客户端操作:将服务端新最新的 aidl 文件都复制过来

将服务端定义的类型:Human.java 连同包结构复制到客户端 src/main/java/ 下

在 Activity 中绑定服务的回调用,用 iHumanInterface(IHumanInterface 类型) 接收返回值:private ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

iHumanInterface = IHumanInterface.Stub.asInterface(service);

Log.d(TAG, "onServiceConnected: ");

}

@Override

public void onServiceDisconnected(ComponentName name) {

// 回收资源

// iMyCaculatorService = null;

iHumanInterface = null;

Log.d(TAG, "onServiceDisconnected: ");

}

};

新创建一个点击事件,在点击事件中操作新的接口:private List add(Human human) throws RemoteException {

return iHumanInterface.addHuman(human);

}

btnAddHuman.setOnClickListener(v -> {

try {

add(new Human("秦始皇",33));

add(new Human("汉武帝",53));

add(new Human("唐太宗",55));

List humans = add(new Human("宋太祖", 65));

for (Human human : humans) {

Log.d(TAG, "onClick: " + human.getName() + "," + human.getAge());

}

} catch (RemoteException e) {

e.printStackTrace();

}

});运行(先启动服务端,再启动客户端)后输出日志:onClick: 秦始皇,33

onClick: 汉武帝,53

onClick: 唐太宗,55

onClick: 宋太祖,65

代码之后再上传。。。

aidl java,AIDL 简单使用相关推荐

  1. java aidl多线程_AIDL踩坑实战

    AIDL理论 AIDL(Android 接口定义语言)可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口. 在 Android 上,一个进程通常无法访问另一个进程的内 ...

  2. AIDL 应用间简单通信demo及基本问题

    AIDL:Android Interface Definition Language,即Android接口定义语言. 他的作用大家已经知道了,有些童鞋对于其中的使用细节可能会有一些理解误差,并且会造成 ...

  3. android aidl空指针,AIDL使用笔记

    最近这段时间在项目开发中使用到了AIDL,之前对这块的内容比较陌生.所以特地分享一下关于AIDL的一些使用知识,如果有什么写的不对的地方还请指出.这里先谢谢了!!! 本文知识点: AIDL简介 AID ...

  4. 【Binder 机制】AIDL 分析 ( AIDL 通信完整流程梳理 )

    文章目录 AIDL 跨进程通信完整流程梳理 1.AIDL 文件编译 2.注册服务 3.IMyAidlInterface.Stub.asInterface 方法获取远程服务 4.IMyAidlInter ...

  5. java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)

    用java实现简单的小游戏(你一定玩过) 对于java初学者来说,通过一些学习小游戏来对swing学习以及对java基础的学习是一个好的方法,同时也给学习带来了很多的乐趣,接下来就给大家分享一个jav ...

  6. java实现简单窗体小游戏----球球大作战

    java实现简单窗体小游戏----球球大作战 需求分析 1.分析小球的属性: ​ 坐标.大小.颜色.方向.速度 2.抽象类:Ball ​ 设计类:BallMain-创建窗体 ​ BallJPanel- ...

  7. Java JNI简单实现

    Java JNI简单实现 JNI(Java Native Interface)允许了Java和C&C++进行交互?这不折腾人嘛! 一.JNI简述 http://baike.baidu.com/ ...

  8. java实现账号单一ip登录,使用Java实现简单后台访问并获取IP示例

    使用Java实现简单后台访问并获取IP示例 发布时间:2020-10-28 21:57:57 来源:亿速云 阅读:92 作者:Leah 使用Java实现简单后台访问并获取IP示例?针对这个问题,这篇文 ...

  9. 用limit 实现java的简单分页

    https://blog.csdn.net/xinyuezitang/article/details/84324359 用limit 实现java的简单分页 xinyuezitang 2018-11- ...

最新文章

  1. 查看Ubuntu 系统的版本
  2. androidwakelock_Android音频播放时wakelock的实现
  3. 【Java】阶段性总结练习------图书管理系统实现
  4. 【FPGA】单端口RAM的设计(同步读、同步写)
  5. Service-policy 的出入(QOS)
  6. Nginx之负载均衡(四)
  7. 交互式计算机图形学总结:第一章 图形系统和模型
  8. 给微软的依赖注入框架写一些扩展方法
  9. 里加一列为1_9月1号新宠物食品法规实施啦,辣鸡宠物食品遭殃,你也可能违法...
  10. 常见算法详解(原理及代码实现Python版本)
  11. MarkDown编辑器语法指南——SegmentFault
  12. 一套完整的直播系统开发、直播平台搭建的原理
  13. linux上的手机管家,腾讯手机管家官网版
  14. POI和jxl的比较
  15. IIS反向代理 URL重写 404或500 错误问题的解决方案
  16. ModSecurity web application firewall (WAF) Research - .Little Hann
  17. Typecho炫彩鼠标插件:HoerMouse
  18. 去空格/去空白行在线工具
  19. 亚马逊SP-API对接实践
  20. gin阶段学习(入门)

热门文章

  1. vscode 配置javaweb开发环境,超级简单,纯新手带图,学会后真香.宇宙无敌第一编辑器vscode
  2. LaTeX源文件的文件名最好不要带空格
  3. 几种查看centos版本的方法
  4. Linux如何创建文件在指定的目录?
  5. 服务器出现 HTTP 400、404、500、502 错误原因及解决方法
  6. html自动跳转源码,两款404页面自动跳转源码html
  7. 干货 | 金融深圳还是干不过杭州啊,“北上广深”要改名”北上广杭”了。。。...
  8. 174_技巧_Power BI 动态格式(万|亿)
  9. codeforces 896A dfs
  10. 盘点2022年有影响力的五种顶级NFT头像