aidl java,AIDL 简单使用
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 简单使用相关推荐
- java aidl多线程_AIDL踩坑实战
AIDL理论 AIDL(Android 接口定义语言)可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口. 在 Android 上,一个进程通常无法访问另一个进程的内 ...
- AIDL 应用间简单通信demo及基本问题
AIDL:Android Interface Definition Language,即Android接口定义语言. 他的作用大家已经知道了,有些童鞋对于其中的使用细节可能会有一些理解误差,并且会造成 ...
- android aidl空指针,AIDL使用笔记
最近这段时间在项目开发中使用到了AIDL,之前对这块的内容比较陌生.所以特地分享一下关于AIDL的一些使用知识,如果有什么写的不对的地方还请指出.这里先谢谢了!!! 本文知识点: AIDL简介 AID ...
- 【Binder 机制】AIDL 分析 ( AIDL 通信完整流程梳理 )
文章目录 AIDL 跨进程通信完整流程梳理 1.AIDL 文件编译 2.注册服务 3.IMyAidlInterface.Stub.asInterface 方法获取远程服务 4.IMyAidlInter ...
- java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)
用java实现简单的小游戏(你一定玩过) 对于java初学者来说,通过一些学习小游戏来对swing学习以及对java基础的学习是一个好的方法,同时也给学习带来了很多的乐趣,接下来就给大家分享一个jav ...
- java实现简单窗体小游戏----球球大作战
java实现简单窗体小游戏----球球大作战 需求分析 1.分析小球的属性: 坐标.大小.颜色.方向.速度 2.抽象类:Ball 设计类:BallMain-创建窗体 BallJPanel- ...
- Java JNI简单实现
Java JNI简单实现 JNI(Java Native Interface)允许了Java和C&C++进行交互?这不折腾人嘛! 一.JNI简述 http://baike.baidu.com/ ...
- java实现账号单一ip登录,使用Java实现简单后台访问并获取IP示例
使用Java实现简单后台访问并获取IP示例 发布时间:2020-10-28 21:57:57 来源:亿速云 阅读:92 作者:Leah 使用Java实现简单后台访问并获取IP示例?针对这个问题,这篇文 ...
- 用limit 实现java的简单分页
https://blog.csdn.net/xinyuezitang/article/details/84324359 用limit 实现java的简单分页 xinyuezitang 2018-11- ...
最新文章
- 查看Ubuntu 系统的版本
- androidwakelock_Android音频播放时wakelock的实现
- 【Java】阶段性总结练习------图书管理系统实现
- 【FPGA】单端口RAM的设计(同步读、同步写)
- Service-policy 的出入(QOS)
- Nginx之负载均衡(四)
- 交互式计算机图形学总结:第一章 图形系统和模型
- 给微软的依赖注入框架写一些扩展方法
- 里加一列为1_9月1号新宠物食品法规实施啦,辣鸡宠物食品遭殃,你也可能违法...
- 常见算法详解(原理及代码实现Python版本)
- MarkDown编辑器语法指南——SegmentFault
- 一套完整的直播系统开发、直播平台搭建的原理
- linux上的手机管家,腾讯手机管家官网版
- POI和jxl的比较
- IIS反向代理 URL重写 404或500 错误问题的解决方案
- ModSecurity web application firewall (WAF) Research - .Little Hann
- Typecho炫彩鼠标插件:HoerMouse
- 去空格/去空白行在线工具
- 亚马逊SP-API对接实践
- gin阶段学习(入门)
热门文章
- vscode 配置javaweb开发环境,超级简单,纯新手带图,学会后真香.宇宙无敌第一编辑器vscode
- LaTeX源文件的文件名最好不要带空格
- 几种查看centos版本的方法
- Linux如何创建文件在指定的目录?
- 服务器出现 HTTP 400、404、500、502 错误原因及解决方法
- html自动跳转源码,两款404页面自动跳转源码html
- 干货 | 金融深圳还是干不过杭州啊,“北上广深”要改名”北上广杭”了。。。...
- 174_技巧_Power BI 动态格式(万|亿)
- codeforces 896A dfs
- 盘点2022年有影响力的五种顶级NFT头像