`
yanwenjinhaha
  • 浏览: 16233 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

AIDL用法总结

阅读更多
AIDL其实并没有多么复杂。
它是用来方便我们开发者编程的一个命令工具而已。
Android在编译时,会通过它将AIDL文件生成对应的Java文件。
这个Java文件就是用来进行IPC进程间通信。

下面详细说明这个Java文件的构成。以ITestAidl.AIDL文件为例进行说明。
ITestAidl.AIDL文件里申明onCallBack()方法。
Android编译会在gen目录下生成ITestAidl.Java文件。

这个Java文件中有Interface ITestAidl,以及I/F onCallBack()。

Interface ITestAidl下有内部抽象类ITestAidl.Stub,
这个内部抽象类在进行IPC进程间通信时,扮演的是服务端的角色,
它有两个重要的方法asInterface(IBinder)和onTransact(Parcel data, Parcel reply, int flags)。

在进程间通信时,如果通信双方处于同一进程时,假如还通过Binder驱动进行通信,很明显是完全没必要的。
asInterface的作用就是,判断通信双方是否处于同一进程,如果是同一进程那么直接提供服务端的实例。
如果处于不同进程,那么提供服务端的代理,该代理会通过Binder驱动进行进程间通信。
其实这个代理在AIDL生成的Java文件中,也一并生成好了。

Binder驱动进行进程通信有一个前提,客户端和服务端要遵守一定的协议,客服端遵照这个协议,
将某个方法的信息(方法参数,该方法对应的ID),通过Binder驱动传递给服务端。服务端接收到信息后,
遵照双方定下的协议,通过方法ID找到对应方法,进行调用。

onTransact就是服务端通过方法ID分发Binder驱动传递过来的消息,调用服务端的具体方法的。
Parcel data:客户端传递过来的数据包
Parcel reply:服务端执行完毕后返回给客户端的数据包
int flags:具体方法的标志

接下来说明服务端代理类ITestAidl.Stub.Proxy,当需要进行间通信时,Stub类的asInterface方法会将这个
Proxy类提供给客户端,客户端通过它调用服务端的方法。
Proxy类中有一个重要的属性mRemote,它是服务端通过构造函数传递给Proxy类。它其实对应的是
Binder驱动层的代理对象(这个地方太复杂,我还不能完全说清楚)。
Proxy也实现了Interface ITestAidl的I/F方法onCallBack(),这里就是按照客户端和服务端双方的协议
将onCallBack()的方法ID,需要的数据,以及需要返回的数据打包,调用方法transact传递到Binder驱动层。
Binder驱动层将消息传递到服务端。这样就进行IPC进程间通信。
分享到:
评论

相关推荐

    AndroidAIDL

    总结,AIDL是Android系统提供的一种高效、灵活的进程间通信方式,它简化了跨进程通信的复杂性,让开发者可以方便地在服务和客户端之间传递数据和调用方法。掌握AIDL的使用,对于开发大型的、需要多进程协作的Android...

    ITelephony.aidl和NeighboringCellInfo.aidl

    总结一下,`ITelephony.aidl`和`NeighboringCellInfo.aidl`是Android系统中处理电话功能和邻近小区信息的关键接口。`ITelephony.aidl`提供对电话操作的访问,如挂断电话,而`NeighboringCellInfo.aidl`则用于获取...

    AIDL的使用实例

    **AIDL(Android Interface Definition Language)**是Android系统提供的一种接口定义语言,用于在不同进程间进行通信...通过博客中的实例,我们可以更深入地理解和掌握AIDL的用法,为自己的Android应用开发带来便利。

    AIDL和JNI使用的小例子

    总结一下,本示例提供的`testndk`项目是一个结合使用AIDL和JNI的实践案例,展示了如何在Android应用中进行跨进程通信并利用C/C++代码提升性能。通过阅读源码和配合博客文章,你可以深入理解这两种技术的工作原理和...

    AIDL用法演示Demo

    本Demo是AIDL用法的一个实践示例,通过运行它,我们可以直观地理解AIDL的工作原理和流程。 首先,我们需要了解AIDL的基本结构。一个AIDL文件通常包含接口定义,接口中可以声明各种方法,这些方法参数和返回值类型...

    AIDL简单使用示例代码

    在本示例中,我们将探讨"AIDL简单使用"的代码实践。 首先,我们需要了解AIDL的基本结构。AIDL文件是`.aidl`格式,它定义了一个接口,该接口包含了服务和客户端之间可以调用的方法。下面是一个简单的AIDL接口示例: ...

    Aidl服务详细介绍,包括使用方法和分析。

    五、用法小结 AIDL服务的使用主要包括服务的声明、实现、注册,以及客户端的连接和调用。注意,由于涉及到跨进程,所以通信会有一定的开销,不适合频繁或大量数据的传递。同时,服务的生命周期管理和异常处理也是...

    Android C/S结构中AIDL的用法 - 计算数的平方

    总结,AIDL是Android系统中实现进程间通信的重要手段,通过定义接口,服务端可以提供功能,而客户端可以方便地调用这些功能,实现跨进程的操作。在"Android C/S结构中AIDL的用法 - 计算数的平方"这个例子中,我们...

    AIDL for HALs测试客户端

    3. **连接服务**:在客户端应用中,通过`IBinder`对象获取服务的引用,并使用`bindService()`方法建立连接。 4. **执行测试**:使用生成的客户端接口调用HAL服务的方法,执行测试用例。 5. **断开连接**:测试完成后...

    AIDL最全Demo

    在`Client.zip`中,可能包含了客户端代码,展示了如何使用生成的Java代理类连接到`RemoteServer`并调用其方法。客户端首先获取服务的`IBinder`接口,然后通过这个接口调用远程方法。 总结,AIDL是Android中实现跨...

    Andorid AIDL模拟实现

    Android AIDL(Android Interface ...总结,Android AIDL是实现跨进程通信的重要工具,它简化了服务端和客户端之间的交互。通过理解AIDL的工作原理和使用方式,开发者可以更有效地设计和实现Android应用的组件间通信。

    使用aidl和messenger实现进程间通信(IPC)

    总结,AIDL和Messenger是Android系统中实现IPC的两种主要手段,它们各有优劣,适用于不同的场景。开发者应根据实际需求选择合适的方式进行进程间通信。在实际项目中,理解并熟练运用这两种技术,能极大地提升应用的...

    安卓aidl学习源码

    本篇文章将深入探讨AIDL的原理、使用方法以及其在IPC中的作用,同时结合提供的"aidlStudy"和"aidlClient"两个源码示例进行详细解析。 **1. AIDL简介** AIDL是Android系统中用于定义接口的一种语言,它允许开发者在...

    AIDL代码示例

    总结来说,**AIDL** 更适合于需要高效、类型安全的进程间通信场景,而**非AIDL** 方法则更适合于快速实现简单通信或者广播通知的场景。在实际开发中,根据项目需求和性能要求选择合适的IPC方式是非常重要的。

    aidl基本数据类型Demo

    总结一下,"aidl基本数据类型Demo"展示了如何使用AIDL在Android中实现进程间通信。通过定义AIDL接口,服务端提供实现该接口的Binder对象,客户端通过连接服务并调用接口方法来实现跨进程的数据交换。理解并熟练掌握...

    使用AIDL通过进程APK之间通信

    总结,AIDL在Android中提供了强大的进程间通信能力,让开发者可以轻松地在不同的应用程序之间进行数据交换和服务调用。通过定义接口、实现服务、注册服务、连接服务和调用方法等步骤,我们就可以实现类似A.apk向B....

    AIDL使用DEMO

    本DEMO将详细展示AIDL的使用过程。** 在Android开发中,当需要在一个应用程序中调用另一个应用程序的服务时,由于Android的多进程特性,简单的函数调用无法实现。此时,AIDL就显得尤为重要。AIDL的基本工作流程如下...

    AIDL_RemoteService

    2. **接口定义**:AIDL文件使用类似于Java的方法签名定义接口,包括方法名、参数类型和返回值类型。所有参数和返回值必须是基本数据类型、List、Map或者实现了AIDL接口的类。 3. **编译过程**:Android编译系统会...

    AIDL自定义类型交互

    在AIDL文件中,我们可以定义一个接口,比如`IService`,并声明一个使用自定义类型`Person`的方法: ```aidl interface IService { void sendPerson(Person person); } ``` **5. 服务端实现** 在服务端,我们需要...

    安卓aidl的demo,包括自定义类型

    总结,这个“安卓aidl的demo”提供了一个完整的示例,展示了如何使用AIDL进行跨进程通信,包括服务端的创建、客户端的调用,以及自定义类型的数据传输。对于理解AIDL的工作原理和实践操作,这是一个非常有价值的参考...

Global site tag (gtag.js) - Google Analytics