Android学习笔记(1) - AIDL之一

本文介绍了Android中的AIDL(Android Interface Description Language),用于简化进程间通信(IPC)。通过一个AIDL使用示例,阐述了AIDL如何生成中间Java代码,以及如何在服务端和客户端之间实现通信。重点分析了IBinder接口、Stub类的角色和通信过程,揭示了Binder框架下的IPC机制。
摘要由CSDN通过智能技术生成

1.  AIDL使用例子

AIDL,Android Interface Describle Language是android接口描述语言, 它并不是代码(虽然语法和Java很类似),而是需要通过中间编译器编译成Java代码。关于AIDL如何使用的例子网上资料很多(比如下面两个链接),本次学习借用网上例子自己实现,并分析大致的代码流程。

        https://www.jianshu.com/p/ef86f682a8f9

        https://www.jianshu.com/p/0641aef2c9e9

首先借用上面链接中的一张图。简单来说就是AIDL描述了进程间通信的接口,通过编译器编译成中间Java代码,进程实现基于编译的中间代码实现很少的部分代码就可以实现通信功能(Android也提供很多帮助类,如下面看到的Service, ServiceConnection等)。我们知道Android上绝大部分的进程间通信使用的都是Binder,其实AIDL底层也是基于Binder,但AIDL的出现使得APP开发者无需进行繁杂的Binder操作,可以十分方便的实现IPC。

顾名思义,该语言是用来描述接口的,也即server和client之间通信API的定义以及接口中用到的数据的定义。如下是示例中的两个定义,它的语法和Java类似,第一行是包名,第二行import,后面通过interface定义接口。

// IAddService.aidl
package hai.mytest;

// Declare any non-default types here with import statements
import hai.mytest.Userd;

interface IAddService {
    int add(in int v1, in int v2);

    List<Userd> addUser(in Userd user);
}
// Userd.aidl
package hai.mytest;

parcelable Userd;

在实际使用的时候如何进行编译。在Androidstudio中编译结果位于build/generated/source/aidl/debug(release)/xxx/,调用的编译工具可以从build的log中获知。如果需要再源码中编译则可以在Android.mk中通过call all-Iaidl-files-under函数来加入编译,如下所示。需要注意的是aidl文件需要同时放在server和client,而且路径要一致,然后在server和client继承中间代码并实现相应接口。

LOCAL_SRC_FILES := $(call all-java-files-under, src) \
    $(call all-Iaidl-files-under, src)

    如下是接口IAddService.aidl文件生成的同名Java文件IAddService.java,实际上是一个IAddService接口,这个接口继承android.os.IInterface。其中2个函数add和addUser是用户(如前面代码所示)增加的接口,这两个接口需要用户自己实现。另外内部有一个静态抽象类Stub(为了整个代码清晰,暂时省略具体实现,用...代替;下面展开分析),它继承自android.os.Binder同时需要实现父类接口,从android.os.Binder名字也能知道,主要目的就是为了实现Binder通信。

/*
 * This file is auto-generated.  DO NOT MODIFY.
 */
package hai.mytest;
public interface IAddService extends android.os.IInterface
{
    /** Local-side IPC implementation stub class. */
    public static ab
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值