AIDL (Android Interface Definition Language)是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。AIDL IPC机制是面向接口的,轻量级。它是使用代理类在客户端和实现端传递数据。
为了体现IPC进程见通信的效果,创建两个项目,一个作为服务器,一个作为客户端。工程如下是:AidlTypeClient和AidlTypeService。
基本数据类型调用:
客户端调用服务器端代码,然后在服务器端显示请求的数据信息!运行效果如下:
创建AIDL接口定义文件ITypeService.aidl:
package com.anhuioss.aidl; interface ITypeService { void basicTypes(int anInt, long aLong, char aChar, boolean aBoolean, float aFloat, double aDouble, String aString); }
实现接口:
public class TypeService extends Service { private Handler mHandler = new Handler(); private ITypeService.Stub typeService = new ITypeService.Stub() { @Override public void basicTypes(final int anInt, final long aLong, final char aChar, final boolean aBoolean, final float aFloat, final double aDouble, final String aString) throws RemoteException { mHandler.post(new Runnable() { @Override public void run() { String text = "Int:" + anInt + "\nLong:" + aLong + "\nChar:" + aChar + "\nBoolean:" + aBoolean + "\nFloat:" + aFloat + "\nDouble:" + aDouble + "\nString:" + aString; Toast.makeText(TypeService.this, text, Toast.LENGTH_SHORT).show(); } }); } }; @Override public IBinder onBind(Intent intent) { return typeService; } }
说明:
- mHandler用于开启新的线程做相关操作;
- onBind暴露接口给客户端;
服务器端需要把这个服务注册到系统中,所以在Manifest文件中给出如下形式的设置:
<service android:name=".TypeService" > <intent-filter > <action android:name="com.anhuioss.aidl.TYPE_SERVICE" > </action> </intent-filter> </service>
说明:
- TypeService是一个处理ITypeService相关逻辑的Service;
- action用于找到匹配的服务并做相关处理;
客户端需要做的是获得接口并调用相应方法。为了让客户端知道服务器端定义的接口,本示例中简单的把相关类复制到客户端中,然后引用,即把服务器端的ITypeService.java复制到客户端的相同包路径下。
客户端使用时,需要绑定服务,示例中是在onStart和onStop中分别做绑定和取消绑定的操作,如下:
@Override protected void onStart() { super.onStart(); bindService(new Intent("com.anhuioss.aidl.TYPE_SERVICE"), this, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); unbindService(this); }
绑定后,需要在ServiceConnection中的onServiceConnected和onServiceDisconnected做相关操作,例如在onServiceConnected中获得远程服务的对象引用等。获得引用的代码如下:
@Override public void onServiceConnected(ComponentName name, IBinder service) { typeService = ITypeService.Stub.asInterface(service); }
而客户端的调用比较简单,示例中在一个方法中完成,如下:
private void callBaseType() { try { typeService.basicTypes(123, 123456, 'A', true, 123.456f, 123456.789d, "string"); } catch (RemoteException e) { e.printStackTrace(); } }
在aidl文件中,基本类型,如int, long, char, boolean, String, List, Map等,可以直接使用。其它类型需要实现了Parcelable protocol 以及按值传递的自定义类,必须要import 语句声明。
下面以传递一个Dog类为例,说明具体操作。Dog类的具体实现如下:
import android.os.Parcel; import android.os.Parcelable; public class Dog implements Parcelable { private String name; private int age; private String color; public static final Parcelable.Creator<Dog> CREATOR = new Creator<Dog>() { @Override public Dog[] newArray(int size) { return new Dog[size]; } @Override public Dog createFromParcel(Parcel source) { return new Dog(source); } }; public Dog(String name, int age, String color) { this.name = name; this.age = age; this.color = color; } public Dog(Parcel pl) { age = pl.readInt(); name = pl.readString(); color = pl.readString(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(age); dest.writeString(name); dest.writeString(color); } @Override public String toString() { return "{Name:" + name + " Age:" + age + " Color:" + color + "}"; } }
为了在aidl中使用Dog类,需要使用aidl描述该类,如下:
parcelable Dog;
同时需要在ITypeService.aidl文件中添加和Dog相关的内容,如下:
package com.anhuioss.aidl; import com.anhuioss.aidl.Dog; interface ITypeService { void basicTypes(int anInt, long aLong, char aChar, boolean aBoolean, float aFloat, double aDouble, String aString); void objectType(in Dog aDog); }
根据服务端代码提示,修改TypeService的代码,添加如下内容:
@Override public void objectType(final Dog aDog) throws RemoteException { mHandler.post(new Runnable() { @Override public void run() { Toast.makeText(TypeService.this, aDog.toString(), Toast.LENGTH_SHORT).show(); } }); }
服务端完成,下面只要在客户端添加UI时间和相应的调用即可,如下:
private void callObjectType() { try { typeService.objectType(new Dog("Tom", 3, "WHITE")); } catch (RemoteException e) { e.printStackTrace(); } }
上面的代码提示出错吧,原因是测试客户端的ITypeService.java不是最新的而且没有Dog类。跟新ITypeService.java文件,同时复制Dog类到客户端即可!运行效果如下:
上面的调用的返回类型是void,而返回类型是其它数据类型的调用方式基本一样,再次不再赘述!
看下效果,如下:
上述都是单方面调用,下面对操作中的回调做简要说明。之所以可以回调,是因为调用和被调用双方都可以直接或间接获得对方的引用,从而调用相应的方法。
为了完成回调,先在服务端添加一个新的接口定义ITypeServiceListener.aidl:
package com.anhuioss.aidl; interface ITypeServiceListener { void requestCompleted(String message); }
对于服务器而言,这个Listener仅仅是一个接口定义,而具体实现是不同客户端的职责,所以到此即可。为了让服务端可以获得Listener的引用,可以在服务进行连接时获得,故需要在ITypeService中添加一个方法用于实现这个关联,如下:
void request(ITypeServiceListener lintener);
服务端的修改到此已经结束,下面是对客户端的修改。同样,需要更新ITypeService.java文件,同时把服务端的ITypeServiceListener.java文件复制到客户端,下面就是实现客户端的Listener并暴露给服务端即可。
客户端的Listener实现如下:
private ITypeServiceListener.Stub typeServiceListener = new ITypeServiceListener.Stub() { @Override public void requestCompleted(String message) throws RemoteException { Message msg = new Message(); Bundle data = new Bundle(); data.putString("data", message); msg.setData(data); mHandler.sendMessage(msg); } };
客户端暴露Listener的方法如下:
private void callBack() { try { typeService.request(typeServiceListener); } catch (RemoteException e) { e.printStackTrace(); } }
好了,我们看看效果吧,如下:
--界面效果--
--服务端进行操作,客户端做其它操作--
--客户端完成操作,回调客户端代码--
多说一句:当然,使用AIDL在同一个APK中也是可以的,如果你原因!代码在附件,如果需要的话!:)
参考开发者网站:http://developer.android.com/guide/components/aidl.html
相关推荐
本文将详细介绍如何使用AIDL调用WPS for Android,并涉及相关的jar文件。 首先,`moffice-aidl.jar`和`moffice-event-interface.jar`是WPS Office为开发者提供的API库,它们包含了与WPS进行通信所需的方法和事件...
Android AIDL 文件不一致引起的调用出错问题 Android AIDL(Android Interface Definition Language)是一种基于接口定义语言,用于定义 Android 应用程序之间的接口。AIDL 文件是用于定义服务端和客户端之间的接口...
在"android简单AIDL调用Demo"中,我们将深入探讨如何使用AIDL创建和调用跨进程服务。 首先,让我们了解AIDL的基本结构。AIDL文件是一个简单的文本文件,后缀为.aidl,它定义了接口以及接口中的方法。例如,如果你有...
- AIDL调用是异步的,因此需要处理可能的并发问题。 - 服务端需要处理客户端断开连接的情况,避免内存泄漏。 **5. 示例** 以下是一个简单的AIDL接口定义: ```aidl interface IAidlInterface { int add(int a, ...
注意,由于跨进程调用的特性,所有通过AIDL调用的方法都有可能抛出`RemoteException`。 5. **多客户端调用管理**: 当有多个客户端同时调用服务端时,服务端需要处理并发调用的情况。每个客户端的调用都是在单独...
Android Aidl(Android Interface Definition Language)是Android提供的一种强大的IPC机制,它允许两个不同进程之间的服务进行接口调用,实现了类似远程方法调用(RPC,Remote Procedure Call)的效果。下面将详细...
在Android平台上,调用WPS(Kingsoft Office)是一项常见的任务,特别是在开发涉及文档查看、编辑或签名的应用时。WPS提供了丰富的API接口,使得开发者能够集成WPS功能到自己的应用中,为用户提供便捷的办公服务。...
**Android aidl Binder框架浅析** 在Android系统中,服务间的通信是通过Binder机制实现的,它是Android系统中进程间通信(IPC)的核心组件。Binder框架允许不同进程间的对象互相调用方法,使得数据和操作可以在不同...
3. **异常处理**:由于AIDL调用跨越进程,无法直接抛出和捕获异常,通常需要通过返回值或特定状态码来表示异常情况。 4. **内存管理**:由于Parcel在进程间传递,客户端传入的对象会被复制,服务端接收到的是复制后...
现在,让我们深入了解Android AIDL调用远程服务的详细知识。 首先,AIDL的基本概念是定义一个接口文件,这个文件包含了客户端与服务端之间交互所需要的方法声明。例如,我们可以创建一个名为`IService.aidl`的文件...
AIDL是一种声明式语言,它允许开发者定义接口,这些接口可以被不同的Android进程调用。当一个应用组件(如Activity)需要与另一个组件进行通信时,如果它们不在同一个进程中,就需要使用AIDL。 在AIDL中定义接口,...
在Android开发中,AIDL(Android Interface Definition Language)是一种用于进程间通信(Inter-Process Communication, IPC)的工具,使得不同应用之间的服务可以共享数据和功能。本示例"android AidlDemo(简单aidl...
Android深入理解分析Aidl调用作业流程 Android深入理解分析Aidl调用作业流程是Android开发中的一项重要技术,Aidl(Android Interface Definition Language)是Android提供的一种接口定义语言,用于描述Android系统...
本教程将详细讲解如何在Android Studio中创建并使用AIDL,以便不同进程间的组件能够相互调用方法,共享数据。 首先,让我们了解AIDL的基本概念。AIDL允许开发者定义一个接口,这个接口可以被Android系统用来生成...
在Android开发中,AIDL(Android Interface Definition Language)是一种用于实现跨进程通信(IPC, ...通过分析和实践这个Demo,开发者将能够熟练运用AIDL进行服务的暴露和调用,进一步提升自己的Android开发技能。
总结起来,Android AIDL是Android系统中实现进程间通信的重要工具,它简化了跨进程调用的复杂性,使得开发者可以方便地在不同的应用程序组件之间共享数据和服务。通过AIDL,我们可以构建更加复杂的Android应用程序,...
在Android应用开发中,当需要在不同进程之间共享数据或调用服务时,AIDL就显得尤为重要。这个"android AIDL 完整DEMO"应该包含了一个完整的示例,帮助开发者理解并实践AIDL的使用。 首先,让我们深入了解一下AIDL的...
在Android系统中,AIDL(Android Interface Definition Language)是一种接口定义语言,用于实现不同进程间的通信,即远程进程通讯。AIDL使得服务(Service)和活动(Activity)这两个独立的APK之间能够相互通信,...