AIDL(Android Interface Definition Language) 是Service 一个重点内容,它广泛应用于实际项目中,可以进行跨进程访问. 在前面 Android 4大应用程序组件 之服务 (Service)博客已经提到了。
一、创建AIDL 服务端步骤如下:
1 在工程的包目录中建立一个.aidl 文件,该文件的语法类似于Java,如果aidl 文件的内容是正确的,ADT 会自动生成一个Java 接口文件(.java)
例如:
package net.blogjava.mobile.aidl;
interface IMyService
{ String getValue(); }
2 建立一个服务类, 也就是Service 的子类
3 实现由aidl 文件生成的 Java 接口
4 在 AndroidManifest.xml 文件中配置AIDL服务,要注意:<action>标签中 android:name的属性就是客户端要引用该服务的ID,也就是Intent 的参数值
例如: <service android:name=".MyService"><intent-filter><action android:name="net.blogjava.mobile.aidl.IMyService" /></intent-filter></service>
以下工程是一个简单的AIDL示例, 这个AIDL 服务只有一个getValue()方法,该方法返回一个String 类型的值,在安装完服务后,会在客户端调用这个getValue(),并将返回值在TextView 组件中输出.
注意: 创建aidl 文件与Java 代码非常用相似,但不能加修饰符(如private ,public)、AIDL 服务不支持的数据类型(如 InputStream,OutputStream)
二、客户端实现步骤:
1. 新建一个aidlclient 工程,并将自动生成的IMyService文件连同包目录一起复制到aidlclient 工程的src目录下,
2. 要调用AIDL 服务首先要绑定服务,然后才能获得服务对象
主要代码如下:
public class Main extends Activity implements OnClickListener {
private IMyService myService = null;
private Button btnInvokeAIDLService;
private Button btnBindAIDLService;
private TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);
btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService);
btnInvokeAIDLService.setEnabled(false);
textView = (TextView) findViewById(R.id.textview);
btnInvokeAIDLService.setOnClickListener(this);
btnBindAIDLService.setOnClickListener(this);
}
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//获得服务对象
myService = IMyService.Stub.asInterface(service);
btnInvokeAIDLService.setEnabled(true);
}
@Override
public void onServiceDisconnected(ComponentName name){}
};
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnBindAIDLService:
//绑定AIDL服务
bindService(new Intent("net.blogjava.mobile.aidl.IMyService"),
serviceConnection, Context.BIND_AUTO_CREATE);
break;
case R.id.btnInvokeAIDLService:
try { textView.setText(myService.getValue()); }
catch (Exception e) { e.printStackTrace(); }
break;
}
}
}
在绑定时需要一个ServiceConnection对象,创建ServiceConnection对象的过程中如果绑定成功,系统会调用onServiceConnected 方法,通过该方法的service 参数值可获得AIDL服务对象.
如图
在运行本示例时,必须首先运行AIDL服务端,再运行客户端
具体代码请参见 ch08_aidl,ch08_aidlclient工程