很多网友来函表示对Android AIDL不是很理解,这里Android123准备了一个简单的例子,帮助大家了解Android上比较强大的远程服务设计吧。 一、为什么要使用AIDL,他的优势有哪些呢? AIDL服务更像是 一个Server,可以为多个应用提供服务。由于使用了IDL这样类似COM组件或者说中间语言的设计,可以让后续的开发者无需了解内部,根据暴漏的接口实现相关的操作,AIDL可以工作在独立的进程中。 二、学习AIDL服务需要有哪些前置知识? 作为Android上服务的扩展,首先你要了解Android Service模型,Android Serivice我们可以分为两种模式,三个类型,1.最简单的Service就是无需处理onBind方法,一般使用广播通讯,效率比较低。2. 使用Binder模式处理Service和其他组件比如Activity通讯,Android开发网提示对于了解了Binder模式的服务后,开发AIDL远程服务就轻松容易的多。 三、具体实例,我们以com.android123.cwj.demo为工程名,首先在工程目录的com.android123.cwj目录下创建一个ICWJ.aidl文件,内容为 package com.android123.cwj; interface ICWJ { String getName(); } 如果格式AIDL格式没有问题,在Eclipse中ADT插件会在工程的gen目录下会自动生成一个Java实现文件。 在Service中代码如下: public class CWJService extends Service { public static final String BIND = "com.android123.cwj.CWJService.BIND"; public String mName="android123"; private final ICWJ.Stub mBinder = new ICWJ.Stub() { @Override […]
AIDL

Android AIDL全攻略一 Android开发技术
Android的服务开发中我们可能都是Activity和Service同进程处理,但想象过系统提供的各种ServiceManager吗? 比如 SensorManager、SmsManager 这些服务可以提供给任意应用,对于这样的公共后台服务器开发类似我们在Win32的COM组件或Symbian的C/S框架,我们需要AIDL(Android Interface Definition Language即Android接口定义语言)来支持服务IPC(interprocess communication IPC)和各个进程的组件进行通讯。 我们将分5节完成以下几个问题 1. AIDL的概念 (本节) 2. Service绑定 3. AIDL基础框架 4. Parcelable 5. Android开源项目中的AIDL示例分析 使用Win32+Eclipse+ADT开发的网友可以通过在SDK的platform/android-x.y/tools文件夹中找到 aidl.exe 文件,这里android123提醒大家注意的是并不是sdk根目录下的tools文件一定要进入到platform中去,其中android-x.y是相应的sdk版本。我们首先执行无参数的aidl可以看到完整的帮助如图: 当然从目前的新版ADT插件来说可以自动的通过AIDL文件生成Java代码,如果使用Ants方式编译可以考虑上面的cmd命令行方式
Android AIDL全攻略二 – Service绑定 Android开发技术
上次我们在 Android AIDL全攻略一 中讲到了AIDL的概念,由于AIDL属于服务相关内容,同时需要涉及到Service绑定问题,作为整个Android AIDL系列教程的第二节我们一起来看下Service绑定问题。我们过去使用一些轻量级的服务可能直接startService启动,通过Service中的onStart方法可以获取执行服务的命令行,其中参数Intent可以传递内容,当然作为低频度的传输也可以考虑Broadcast来交互Activity和Service,但是作为正常专业的长久的服务Android123还是推荐大家使用绑定机制来实现数据的传输。其中系统级别的跨进程服务AIDL就是基于Service绑定方式的。 作为Service必须重写一个方法就是onBind(),如果使用startService方式启动服务,则我们在onBind()中返回一个null的IBinder对象。今天使用bindService方法将如何写呢? 具体的步骤如下: 1. 使用bindService方法启动服务,bindService (Intent service, ServiceConnection conn, int flags) 有三个参数,这里大家可能会对第二个ServiceConnection和最后第三个参数的标识感到陌生,一般在我们调用bindService时需要一个ServiceConnection获取服务实例以及状态,代码如下 private ServiceConnection sc = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Toast.makeText(ctx, "android123 service connected", Toast.LENGTH_LONG).show(); } @Override public void onServiceDisconnected(ComponentName name) { Toast.makeText(ctx, "android123 service disconnected", Toast.LENGTH_LONG).show(); } }; 这样,我们在服务的连接和断开时都会收到一个Toast的消息提示,而bindService最后的参数一般使用BIND_AUTO_CREATE 标识自动创建。所以一般我们绑定一个服务,使用下面的代码 bindService(intent, sc, Service.BIND_AUTO_CREATE); 来启动服务,而解除绑定可以用 unbindService(sc); 2. […]
Android AIDL全攻略三 – AIDL框架 Android开发技术
在Android AIDL全攻略的一和二中我们提到了相关的基础内容,本次我们将通过实例代码完成AIDL框架。这里Android123推荐大家使用Eclipse+ADT的开发方式以提高我们的效率,有关ants和aidl命令的编译方式不了解的可以来函至android123@163.com 我们会及时回复。 1. AIDL的语法和框架,Android IDL语言类似Java的接口,可以使用常规的String、Boolean等类型,但对于数值传递我们需要使用 Parcelable 接口,如果你不了解 Parcelable 的使用,Android123将在下节详细解释。 2. 在我们的工程中创建一个 xxx的.aidl文件,这时回到Eclipse重新构建工程可以发现在/res/gen的文件夹下会自动生成Ixxx.java文件,ADT帮我们实现这个接口的stub类,具体的AIDL文件内容比如为: package com.android123.cwj; interface IWeatherService { int getTemperature(in String city,out String temperature); int getTemperatureList(in String city, out String[] temperature);} 上面我们注意AIDL文件中的方法,参数类型前面有in和out关键字,类似Win32 COM中的IN或OUT,分别代表传入和输出,对于Java文件,ADT插件会在res/gen中生成一个java文件实现Stub子类。本文未完成,
写给初学者,Android AIDL必看内容 Android开发技术
更好的设计Android软件应该熟悉掌握AIDL IPC机制,可以让你编写的组件类似Windows ActiveX COM一样更好的复用,提供类似像Symbian那样的服务器机制。服务可以很好的解决在后台运行无UI的窗口。我们创建一个aidl文件名为android123.aidl下面是示例代码,修改于Android SDK文档。 一、创建AIDL文件 package cn.com.android123; 引入声明 import cn.com.android123.IAtmService; // 声明一个接口,这里演示的是银行ATM程序interface IBankAccountService { int getAccountBalance(); //返回整数,无参数 void setOwnerNames(in List<String> names); //不返回,包含一个传入List参数 BankAccount createAccount(in String name, int startingDeposit, in IAtmService atmService); //返回一个自定义类型 int getCustomerList(in String branch, out String[] customerList); //返回整形,输入一个分支,输出一个客户列表} 二、实现一个接口 显示的提供一个导出接口,为客户端提供绑定。 public class RemoteService extends Service { @Override public IBinder onBind(Intent intent) { […]
Android AIDL接口定义语言你知道吗? Android开发技术
Android进程之间如何通讯呢? 在Windows系统中存在IPC管道服务、MailSolt邮槽、消息等方法,在Android平台上提供了一种中间层语言AIDL Android接口定义语言(Android Interface Definition Language)。 实现IPC服务通过使用AIDL步骤主要有: 1.创建aidl文件,这个文件定义了一个接口(XXX.aidl),定义一些方法和字段引用对客户端。 2.添加xxx.aidl问见到你的makefile工程文件中(通过Eclipse插件管理) 3.实现你的接口方法,AIDL编译器会创建一个接口使用Java语言,这个接口封装了一些结构化的类名如Stub,通过集成这个接口实现一些必要的附加方法通过IPC服务调用,你必须创建一个扩展类接口,在你的aidl文件中,我们看到很像Windows Mobile中的ActiveX COM组件或者Symbian的 ECOM接口。 4.暴露你的接口给客户端,如果你写成一种服务形式,你必须扩展服务重载Service.onBind(Intent)来返回一个类实例来实现你的接口。

