1 - 实现service端应用。
2 - 实现client端应用。
实现service端应用
1. 建立一个空的Android工程aidlservice。在src目录下建立一个扩展名为aidl的文件(IMyService.aidl)。
- package com.yubing;
- interface IMyService
- {
- String getValue(); // 为AIDL服务的接口方法,调用AIDL服务的程序需要调用该方法
- }
2. 在保存IMyService.aidl文件后,ODT会在gen目录下产生一个IMyService.java文件。
读者可以不必管这个文件中的内容,也不需要修改该文件的内容。这个文件是由Eclipse插件ODT自动维护的,只要修改了IMyService.aidl文件的内容,IMyService.java文件的内容就会随之改变。
3. 建立一个服务类(Service的子类),实现由aidl文件生成的Java接口。
- package com.yubing;
- ... ...
- public class MyService extends Service
- {
- // IMyService.Stub类是根据IMyService.aidl文件生成的类,该类中包含了接口方法(getValue)
- public class MyServiceImpl extends IMyService.Stub
- {
- @Override
- public String getValue() throws RemoteException
- {
- return "从AIDL服务获得的值:OK.";
- }
- }
- @Override
- public IBinder onBind(Intent intent)
- {
- // 该方法必须返回MyServiceImpl类的对象实例
- return new MyServiceImpl();
- }
- }
4. 在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签的android:name属性值就是客户端要引用该服务的ID,也就是Intent类构造方法的参数值。
- <!-- 注册服务 -->
- <service android:name=".MyService">
- <intent-filter>
- <!-- 指定调用AIDL服务的ID -->
- <action android:name="com.yu.IMyService" />
- </intent-filter>
- </service>
实现client端应用
下面来看看如何调用这个AIDL服务。首先建立一个Android工程:aidlclient。然后将aidlservice工程中自动生成的IMyService.java文件复制到aidlclient工程中。在调用AIDL服务之前需要先使用bindService方法绑定AIDL服务。bindService方法需要一个ServiceConnection对象。ServiceConnection有一个onServiceConnected方法,当成功绑定AIDL服务且,该方法被调用。并通过service参数返回AIDL服务对象。下面是调用AIDL服务的完成代码。
- package com.yu;
- ... ...
- public class Main extends Activity implements OnClickListener
- {
- private IMyService myService = null;
- // 创建ServiceConnection对象
- private ServiceConnection serviceConnection = new ServiceConnection()
- {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service)
- {
- // 获得AIDL服务对象
- myService = IMyService.Stub.asInterface(service);
- try
- {
- // 调用AIDL服务对象中的getValue方法,并以对话框中显示该方法的返回值
- new AlertDialog.Builder(Main.this).setMessage(
- myService.getValue()).setPositiveButton("确定", null)
- .show();
- }
- catch (Exception e)
- {
- }
- }
- @Override
- public void onServiceDisconnected(ComponentName name)
- {
- }
- };
- @Override
- public void onClick(View view)
- {
- // 绑定AIDL服务
- bindService(new Intent("com.yu.IMyService"),
- serviceConnection, Context.BIND_AUTO_CREATE);
- }
- ... ...
- }
在编写AIDL服务和客户端时要注意如下两点:
1. AIDL服务中的onBind方法必须返回AIDL接口对象(MyServiceImpl对象)。该对象也是onServiceConnected事件方法的第2个参数值。
2. bindService方法的第1个参数是Intent对象,该对象构造方法的参数需要指定AIDL服务的ID,也就是在AndroidManifest.xml文件中<service>标签的<action>子标签的android:name属性的值。
现在先运行aidlservice程序,以便安装AIDL服务,然后运行aidlclient程序,并单击按钮,会显示如图所示的对话框。对话框中的信息就是AIDL服务接口中getValue方法的返回值。