Android之AIDL使用详解

1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口
icp:interprocess communication :内部进程通信

 

2.既然aidl可以定义并实现进程通信,那么我们怎么使用它呢?文档/android-sdk/docs/guide/developing/tools/aidl.html中对步骤作了详细描述:

--1.Create your .aidl file - This file defines an interface (YourInterface.aidl) that defines the methods and fields available to a client.
创建你的aidl文件,我在后面给出了一个例子,它的aidl文件定义如下:写法跟java代码类似,但是这里有一点值得注意的就是它可以引用其它aidl文件中定义的接口,但是不能够引用你的java类文件中定义的接口

package com.cao.android.demos.binder.aidl;  
import com.cao.android.demos.binder.aidl.AIDLActivity;
interface AIDLService {   
void registerTestCall(AIDLActivity cb);   
void invokCallBack();
}  

--2.Add the .aidl file to your makefile - (the ADT Plugin for Eclipse manages this for you). Android includes the compiler, called AIDL, in the tools/ directory.
编译你的aidl文件,这个只要是在eclipse中开发,你的adt插件会像资源文件一样把aidl文件编译成java代码生成在gen文件夹下,不用手动去编译:编译生成AIDLService.java如我例子中代码

--3.Implement your interface methods - The AIDL compiler creates an interface in the Java programming language from your AIDL interface. This interface has an inner abstract class named Stub that inherits the interface (and implements a few additional methods necessary for the IPC call). You must create a class that extends YourInterface.Stub and implements the methods you declared in your .aidl file.
实现你定义aidl接口中的内部抽象类Stub,public static abstract class Stub extends android.os.Binder implements com.cao.android.demos.binder.aidl.AIDLService
Stub类继承了Binder,并继承我们在aidl文件中定义的接口,我们需要实现接口方法,下面是我在例子中实现的Stub类:

private final AIDLService.Stub mBinder = new AIDLService.Stub() {  
@Override  
public void invokCallBack() throws RemoteException {  
Log("AIDLService.invokCallBack");  
Rect1 rect = new Rect1();  
rect.bottom=-1;  
rect.left=-1;  
rect.right=1;  
rect.top=1;  
callback.performAction(rect);  
}  
@Override  
public void registerTestCall(AIDLActivity cb) throws RemoteException {  
Log("AIDLService.registerTestCall");  
callback = cb;  
}  
}; 

Stub翻译成中文是存根的意思,注意Stub对象是在被调用端进程,也就是服务端进程,至此,服务端aidl服务端得编码完成了。

--4.Expose your interface to clients - If you're writing a service, you should extend Service and override Service.onBind(Intent) to return an instance of your class that implements your interface.
第四步告诉你怎么在客户端如何调用服务端得aidl描述的接口对象,doc只告诉我们需要实现Service.onBind(Intent)方法,该方法会返回一个IBinder对象到客户端,绑定服务时不是需要一个ServiceConnection对象么,在没有了解aidl用法前一直不知道它是什么作用,其实他就是用来在客户端绑定service时接收service返回的IBinder对象的:

AIDLService mService;  
private ServiceConnection mConnection = new ServiceConnection() {  
public void onServiceConnected(ComponentName className, IBinder service) {  
Log("connect service");  
mService = AIDLService.Stub.asInterface(service);  
try {  
mService.registerTestCall(mCallback);  
} catch (RemoteException e) {  
}  
}  
public void onServiceDisconnected(ComponentName className) {  
Log("disconnect service");  
mService = null;  
}  
};  

mService就是AIDLService对象,具体可以看我后面提供的示例代码,需要注意在客户端需要存一个服务端实现了的aidl接口描述文件,但是客户端只是使用该aidl接口,不需要实现它的Stub类,获取服务端得aidl对象后mService = AIDLService.Stub.asInterface(service);,就可以在客户端使用它了,对mService对象方法的调用不是在客户端执行,而是在服务端执行。

4.aidl中使用java类,需要实现Parcelable接口,并且在定义类相同包下面对类进行声明:

上面我定义了Rect1类
之后你就可以在aidl接口中对该类进行使用了
package com.cao.android.demos.binder.aidl; 
import com.cao.android.demos.binder.aidl.Rect1;
interface AIDLActivity {  
    void performAction(in Rect1 rect);  

注意in/out的说明,我这里使用了in表示输入参数,out没有试过,为什么使用in/out暂时没有做深入研究。

5.aidl使用完整示例,为了清除说明aidl使用,我这里写了一个例子,例子参考了博客:

http://blog.csdn.net/saintswordsman/archive/2010/01/04/5130947.aspx

作出说明

例子实现了一个AIDLTestActivity,AIDLTestActivity通过bindservice绑定一个服务AIDLTestService,通过并获取AIDLTestActivity的一个aidl对象AIDLService,该对象提供两个方法,一个是registerTestCall注册一个aidl对象,通过该方法,AIDLTestActivity把本身实现的一个aidl对象AIDLActivity传到AIDLTestService,在AIDLTestService通过操作AIDLActivity这个aidl远端对象代理,使AIDLTestActivity弹出一个toast,完整例子见我上传的资源:

http://download.csdn.net/source/3284820



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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用php打印九九乘法表,php如何打印出九九乘法表呢?

摘要:下文讲述使用php代码在页面上输出九九乘法表的示例分享&#xff0c;如下所示&#xff1b;实现思路:主要使用遍历的方式输出九九乘法表例:php 循环输出九九乘法表echo "maomao365.com 示例分享\n";echo "for 循环打印出九九乘法表";for($j1; $j<9; …

他言行不一屡次跳槽,还升职加薪走上了人生巅峰,全数学界都炸了......

全世界只有3.14 % 的人关注了爆炸吧知识看在大家都这么爱学习的份上&#xff0c;今天小天就和大家介绍一名老师吧&#xff01;这位老师就是亚历山大.雅科夫列奇.辛钦&#xff01;家庭教育好&#xff0c;学霸就有了亚历山大.雅科夫列奇.辛钦&#xff0c;1894年出生于前苏联莫斯科…

IoTSharp部署教程-Sqlite分表篇

IoTSharp的部署环境极其灵活&#xff0c;我们推荐使用Docker方式进行部署&#xff0c; 这减少了很多配置&#xff0c; 首先最简单的部署当然属于 Sqlite 数据库&#xff0c; 且不适用任何外部依赖。 在生产环境中&#xff0c; 我们需要配置 appsettings.Production.json 文件&a…

Android之AsyncTask两种线程池分析和总结

Android AsyncTask两种线程池分析和总结(一) 前言在android AsyncTask里面有两种线程池供我们调用1&#xff0e; THREAD_POOL_EXECUTOR, 异步线程池2&#xff0e; SERIAL_EXECUTOR&#xff0c;同步线程池正如上面名称描述的那样&#xff0c;一个是异步线程池&#xff…

一款好的折线图、饼图、柱形图

链接地址http://www.highcharts.com/demo/line-basic/skies http://www.highcharts.com/demo/转载于:https://www.cnblogs.com/blueking/p/3530787.html

被遗忘的数学家!曾提出最接地气的数学定理,可以计算男朋友真不真心的那种......

全世界只有3.14 % 的人关注了爆炸吧知识在介绍了业余数学家费马后&#xff0c;听说很多小伙伴还想看看业余的。这不&#xff0c;小天这次又来介绍业余数学家来了。险些被遗忘托马斯.贝叶斯&#xff0c;十八世纪英国的一个长老会的牧师&#xff08;专业&#xff09;和数学家&…

Android之MVVM框架 - 数据绑定

本教程是跟着 Data Binding Guide 学习过程中得出的一些实践经验&#xff0c;同时修改了官方教程的一些错误&#xff0c;每一个知识点都有对应的源码&#xff0c;争取做到实践与理论相结合。 Data Binding 解决了 Android UI 编程中的一个痛点&#xff0c;官方原生支持 MVVM 模…

再见 Typora,这款 Markdown 编辑器开源又免费!

推荐一个免费开源的 Markdown 编辑器编程导航 致力于推荐优质编程资源 &#x1f48e;项目开源仓库&#xff1a;https://github.com/liyupi/code-nav跪求一个 star ⭐️哈喽大家好&#xff01;我是编程导航的小编火宝。前段时间 Typora 宣布将升级并开始收费&#xff0c;想必大家…

Android窗口管理服务WindowManagerService的简要介绍和学习计划

在前一个系列文章中&#xff0c;我们从个体的角度来分析了Android应用程序窗口的实现框架。事实上&#xff0c;如果我们从整体的角度来看&#xff0c;Android应用程序窗口的实现要更复杂&#xff0c;因为它们的类型和作用不同&#xff0c;且会相互影响。在Android系统中&#x…

Andorid之为何要用到NDK?

概括来说主要分为以下几种情况&#xff1a; 1. 代码的保护&#xff0c;由于apk的java层代码很容易被反编译&#xff0c;而C/C库反汇难度较大。 2. 在NDK中调用第三方C/C库&#xff0c;因为大部分的开源库都是用C/C代码编写的。 3. 便于移植&#xff0c;用C/C写得库可以方便在其…

日本最惨数学天才!37岁裸辞,房子被政府没收,向全村人乞讨,一家五口只能吃野菜.........

全世界只有3.14 % 的人关注了爆炸吧知识数学是火他是飞蛾多年以后&#xff0c;当冈熙哉站在桥本市的数学家纪念碑前&#xff0c;准会想起父亲请他吃面包片的那个遥远的夜晚。当时&#xff0c;他们一家五口蜗居在邻居施舍租出的小库房里。冈洁家三代同堂在他的回忆中&#xff0c…

3、Eternal框架-控制器

2019独角兽企业重金招聘Python工程师标准>>> 介绍 MVC&#xff1a;Model-View-Controller&#xff0c;包括三类对象&#xff0c;Model模型对象、View视图表示、Controller控制器。在应用MVC方式以前&#xff0c;通常将这三个对象的功能合到了一起&#xff0c;通过分…

java配置JDK

1、将JDK文件拷入电脑并解压缩 根据系统版本选择JDK版本&#xff0c;并将eclipse解压缩 2、配置系统环境变量 右键我的电脑--属性--高级系统设置--环境变量 新建JAVA_HOME如图所示&#xff08;严格区分大小写&#xff09; 修改环境变量Path 在变量值一栏的最前面加上%JAVA_HOM…

可怕!原来我们看到的世界地图一直都是“错”的!多年的地理白学了...

▲ 点击查看几乎每个家庭都会有两张地图&#xff1a;一张世界地图&#xff0c;一张中国地图。薄薄的两张纸&#xff0c;蕴藏着让每个人学会“看世界”的磅礴力量。哈佛上一任校长&#xff0c;也是300多年来唯一一位女校长德鲁吉尔平福斯特&#xff08;Drew Gilpin Faust&#x…

.NET 程序测试 Java 项目 log4j2 是否存在远程代码执行漏洞

最近两天被朋友圈的“Apache Log4j2 远程代码执行漏洞”刷屏了&#xff0c;主要是因为组件存在 Java JNDI 注入漏洞&#xff1a;当程序将用户输入的数据记入日志时&#xff0c;攻击者通过构造特殊请求&#xff0c;来触发 Apache Log4j2 中的远程代码执行漏洞&#xff0c;从而利…

史上最牛的文科生:法学出身,却发明出十进制计算器,折磨无数人的微积分符号,跨界40多个领域惊艳学术圈

全世界只有3.14 % 的人关注了爆炸吧知识“世界上没有完全相同的两片树叶。”想必大家对这句话耳熟能详&#xff0c;但却不知道这名言背后的作者是谁吧&#xff1f;其实&#xff0c;他就是与牛顿争论微积分优先权大战中的大佬&#xff1a;莱布尼茨。博览群书 天赋异禀1646年&…

如何解决secureCRT里面的The remote system refused the connection.

不废话,先爆照 Ubuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即可。然后确认sshserver是否启动了: ps -e |grep ssh 如果只有ssh-agent那ss

python 带pydev的eclipse无法导入win32api包(或无法导入其他包)

需要重新配置pydev中的python解释器&#xff0c;因为它不会自动更新。 将原先的python.exe先remove掉&#xff0c;再重新new回来&#xff0c;new回来的时候会让你勾选system libs&#xff0c;把你想要更新的勾选上去就可以了。转载于:https://blog.51cto.com/xuewei/1111889

OC之非ARC环境下循环retain问题

观察上述情况&#xff0c;上述就是著名的循环引用问题&#xff0c;对于此类问题&#xff0c;“你包含我&#xff0c;我包含你”&#xff0c;里面相关的对象占用的内存永远回收不了&#xff0c;解决办法很简单&#xff0c;与常规方法不同。正常情况下&#xff0c;我们应在Person…

我的开源故事

| 作者&#xff1a;李扬| 编辑&#xff1a;钱奕| 设计&#xff1a;杨敏| 责编&#xff1a;钱英宇一、前 言我相信我与开源故事的开始并不是第一次用GitHub或者CSDN&#xff0c;而是突如其来的新冠疫情。2020年1月25日&#xff0c;大年初一&#xff0c;范晶晶的一条关于wuhan202…