Android--AIDL基础介绍

1、跨进程通信

要想了解AIDL的用途,我们先来上个图,聊聊跨进程通信。

图上有进程1、进程2两个进程,如果进程1想要和进程2通信,或者说进程1想要共享数据给进程2,那该怎么做。Android中两个进程想要直接进行通信是不能的,一个应用程序没办法和另一个应用程序进行通讯,这样就保证了数据的安全性,保证一个进程的销毁不会影响到其它进程。

所以谷歌就提供了如图的这样一种间接的方法,进程下面的矩形就是我们的Android系统,进程1进程2都是基于Android系统之上的,所以这两个进程只能让Android系统来帮忙。如果进程1想要向进程2提出一些请求,就会先把它的请求发送给系统,系统收到请求后根据请求的标识找到进程2,把进程2里的相关信息传递回进程1。应用程序间想要通信就是这样完成的。

所以通过上面的说明,跨进程通信可以总结为两点:

  • 两个进程无法直接通信
  • 通过Android系统底层间接通信

要实现跨进程通信,谷歌在SDK中给我们提供了四种方式,分别对应我们的四大组件,这里我们要讲的就是基于Service的方式,使用的语言就是AIDL。

2、AIDL简介

AIDL (Android Interface Definition Language), Android接口定义语言,Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。

我们可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。 在 Android 上,一个进程通常无法访问另一个进程的内存。 既然如此,进程需要将其对象分解成操作系统能够识别的原语,并将对象编组成跨越边界的对象。 编写执行这一编组操作的代码是一项繁琐的工作,因此 Android 会使用 AIDL 来处理。

注:只有允许不同应用的客户端用 IPC 方式访问服务,并且想要在服务中处理多线程时,才有必要使用 AIDL。 如果您不需要执行跨越不同应用的并发 IPC,就应该通过实现一个 Binder 创建接口;或者,如果您想执行 IPC,但根本不需要处理多线程,则使用 Messenger 类来实现接口。

总结可为AIDL使用于IPC、多线程、多个应用程序,Binder使用于IPC、非多线程、多个应用程序,Messenger则是只要做IPC时使用。

3、AIDL文件

AIDL的语法与Java接口是类似的,但AIDL是使用.aidl文件,也就是说必须使用 Java 编程语言语法在 .aidl 文件中定义 AIDL 接口。然后将它保存在托管服务的应用以及任何其他绑定到服务的应用的源代码(src/ 目录)内。

我们开发每个包含 .aidl 文件的应用时,Android SDK 工具都会生成一个基于该 .aidl 文件的 IBinder 接口,并将其保存在项目的 gen/ 目录中。服务必须视情况实现 IBinder 接口。然后客户端应用便可绑定到该服务,并调用 IBinder 中的方法来执行 IPC。

我们来看看.aidl文件是如何定义的:

// 包名,文件必须放在指定的目录
package com.example.android;

// interface 关键字
// 文件名必须对应接口名,IRemoteService.aidl
interface IRemoteService {
   

    // 方法
    int getPid();
}

这就是大致的.aidl文件的书写格式,和Java几乎是一样的。除了在IDE中可以将.aidl编译成Java文件,我们也可以通过命令直接手动编译。

我们在SDK的build-tools下某个android版本里可以看到aidl.exe,我们把这个目录添加到环境变量中就可以使用了。

现在我在D盘下创建了这个目录,我们打开cmd:

cd D:\com\example\android

aidl IRemoteService.aidl

到达指定目录后执行这条命令即可生成Java文件。

不过在开发中我们使用的IDE会帮我们对.aidl文件做处理,这个知识只是给大家了解一下。我们在开发Android时最好使用Android Studio,它的功能真的十分强大。我们在eclipse中需要去改文件,而Android Studio已经把AIDL处理的很完备。

AIDL的文件都会放在一个aidl的文件夹下,这个文件夹是与java文件夹同级的,我们就可以把.aidl的文件都放在这里,这样就比eclipse清晰的多啦。但Android Studio在生成和修改.aidl文件的时候时不会编译产生Java文件的,所以我们需要手动编译一下。

Make Project之后,我们就可以在build中找到生成的Java文件:

这样我们就可以在Java中使用这个接口了。

4、AIDL案例

这里我们实现一个如何在项目中使用AIDL的案例。像在一个大的项目中,已经实现了许多的进程模块,完全够我们使用了。这时我们要开始一个新的项目,考虑到成本,时间等各种问题,我们是没有必要去重复开发的,所以我们就要让新项目去访问旧项目的其中一些服务。

从图中可以知道我们的这个案例,就是点击Button调用服务端的接口方法,传入两个数,然后服务端将结果返回到我们的TextView中。因为这是两个进程,所以就要用到我们的AIDL。

实现这个例子我们需要在Android Studio中创建两个项目,我们先来处理服务端。

创建好项目后,我们在aidl目录下创建一个.aidl文件,文件名就叫ICalculateAIDL。

interface ICalculateAIDL {
   

    int add(int num1, int num2);
}

这个AIDL接口是实现好了,那我们怎么去实现它将两个数相加呢,官方文档是这么说得:

当您开发应用时,Android SDK 工具会生成一个以 .aidl 文件命名的 .java 接口文件。生成的接口包括一个名为 Stub的子类,这个子类是其父接口(例如,YourInterface.Stub)的抽象实现,用于声明 .aidl 文件中的所有方法。如需实现 .aidl 生成的接口,请扩展生成的 Binder 接口(例如,YourInterface.Stub)并实现从 .aidl 文件继承的方法。

所以我们需要创建一个继承Service的Java文件,去处理.Stub接口。

public class ICalculateService extends Service {
   

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private IBinder iBinder = 
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值