`
wen742538485
  • 浏览: 237571 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android AIDL使用详解

阅读更多
http://blog.csdn.net/stonecao/article/details/6425019
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类文件中定义的接口



[java] view plaincopy
01.package com.cao.android.demos.binder.aidl;   
02.import com.cao.android.demos.binder.aidl.AIDLActivity; 
03.interface AIDLService {    
04.    void registerTestCall(AIDLActivity cb);    
05.    void invokCallBack(); 
06.}   


--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类:
 


[java:showcolumns] view plaincopy


·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
01.private final AIDLService.Stub mBinder = new AIDLService.Stub() { 
02. 
03.    @Override 
04.    public void invokCallBack() throws RemoteException { 
05.        Log("AIDLService.invokCallBack"); 
06.        Rect1 rect = new Rect1(); 
07.        rect.bottom=-1; 
08.        rect.left=-1; 
09.        rect.right=1; 
10.        rect.top=1; 
11.        callback.performAction(rect); 
12.    } 
13. 
14. 
15.    @Override 
16.    public void registerTestCall(AIDLActivity cb) throws RemoteException { 
17.        Log("AIDLService.registerTestCall"); 
18.        callback = cb; 
19.    } 
20.}; 


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对象的:



[java] view plaincopy
01.AIDLService mService; 
02.private ServiceConnection mConnection = new ServiceConnection() { 
03.    public void onServiceConnected(ComponentName className, IBinder service) { 
04.        Log("connect service"); 
05.        mService = AIDLService.Stub.asInterface(service); 
06.        try { 
07.            mService.registerTestCall(mCallback); 
08.        } catch (RemoteException e) { 
09. 
10.        } 
11.    } 
12. 
13. 
14.    public void onServiceDisconnected(ComponentName className) { 
15.        Log("disconnect service"); 
16.        mService = null; 
17.    } 
18.}; 


 

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

文章仓促而成,有什么疑问欢迎大家一起讨论。
  • 大小: 19.8 KB
分享到:
评论

相关推荐

    AndroidAIDL

    **Android AIDL(Android Interface Definition Language)详解** 在Android系统中,进程间的通信(IPC, Inter-Process Communication)是至关重要的,特别是在开发大型、复杂的应用时。AIDL(Android Interface ...

    Android AIDL Binder 实现与详解 Demo

    Android AIDL Binder 实现与详解。此资源实现了 Android AIDL 通信,自定义 AIDL 数据类型。同时演示了定向 Tag 『inout in out』的区别。并且配有博文详细解释相关知识点以及需要注意的细节。

    android之AIDL详解demo1

    在"android之AIDL详解demo1"中,我们看到了如何定义、实现和使用AIDL,这只是一个基础示例,实际应用中可能会涉及更复杂的接口定义和数据类型,以及错误处理等高级特性。通过不断实践,开发者可以更好地理解和利用...

    Android AIDL 详解

    Android AIDL(Android Interface Definition Language)是Android系统中用于实现跨进程通信(IPC,Inter-Process Communication)的一种机制。在Android应用开发中,由于每个应用程序都可能运行在独立的进程中,当...

    AIDL使用详解(三) 客户端通过AIDL与服务端通信 实例项目

    AIDL(Android Interface Definition Language)是Android系统提供的一种接口定义语言,用于在不同进程间进行数据交换和服务调用。在Android应用开发中,当需要在客户端和服务端之间进行跨进程通信(IPC,Inter-...

    android的AIDL层讲解

    里面介绍有例子用于说明aidl的作用 使菜鸟们可以更清楚的认识到这层的意义

    Android AIDL1.zip 工程源码

    **Android AIDL基础详解** Android应用开发中,有时我们需要在不同的进程间进行通信,比如服务与客户端间的交互。这时,Android引入了一种接口定义语言(Android Interface Definition Language,简称AIDL),它...

    Android AIDL中Map参数传递的问题详解

    "Android AIDL中Map参数传递的问题详解" Android AIDL中Map参数传递的问题详解是 Android 应用程序接口定义语言(AIDL)中的一個重要课题。AIDL 是 Android 操作系统中的一個接口定义语言,用于定义应用程序之间的...

    android之AIDL详解demo2

    AIDL(Android Interface Definition Language)是Android提供的一种强大的工具,专门用于处理跨进程通信。本篇将深入探讨AIDL的详细知识,并通过一个具体的"ClientAIDLDemo"示例来演示其使用方法。 首先,理解AIDL...

    详解Android aidl的使用方法

    AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写(对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP...

    Androidaidl跨进程调用.rar

    本资源"Androidaidl跨进程调用.rar"包含了两个示例项目:RemoteServerTest和RemoteClientTest,它们分别代表了服务端和客户端,用于演示如何使用AIDL进行跨进程调用。 AIDL的基本概念和工作原理: 1. 接口定义:在...

    Android 进程间通信AIDL使用详解

    从某种意义上说AIDL其实是一个模板,因为在使用过程中,实际起作用的并不是AIDL文件,而是据此而生成的一个IInterface的实例代码,AIDL其实是为了避免我们重复编写代码而出现的一个模板 设计AIDL这门语言的目的就是...

    Android AIDLDemo

    **Android AIDLDemo详解** Android AIDLDemo是一个典型的示例,用于演示在Android系统中如何通过Android Interface Definition Language (AIDL)实现进程间通信(IPC)。在Android Studio环境中,我们可以轻松创建并...

    绑定服务BoundService详解之AIDL的使用(自定义属性也包含其中)

    在“绑定服务BoundService详解之AIDL的使用”中,我们将了解如何利用AIDL创建自定义的接口,以便在Activity与BoundService之间传递复杂的对象和数据。 首先,我们需要创建一个AIDL文件,例如`IMyService.aidl`,在...

    Android aidl 进程通信

    ### Android AIDL 进程间通信详解 #### 一、AIDL 概述 AIDL(Android Interface Definition Language)是Android平台提供的一种用于进程间通信(Inter-Process Communication, IPC)的技术,它允许应用程序组件之间...

Global site tag (gtag.js) - Google Analytics