(来自《安卓开发中文网》)
在这里简单的整理总结,只说明基本用法:
概述:Android系统中进程之间不能共享内存。为了使其他的应用程序可以访问本应用程序提供的服务,Android系统采用了运城过程调用(RPC)方式来实现,使用一种接口定义语言(IDL)来公开服务的接口。这种可以跨进程访问的服务称为AIDL。
建立AIDL服务的步骤(Eclipse):
1、在工程的java包目录中建立一个扩展名为aidl的文件;
2、如果aidl文件的内容正确,ADT会自动生成一个java接口文件(*.java);
3、建立一个服务类(Service的子类);
4、实现由aidl文件生成的java接口;
5、在AndroidManifest.xml文件中配置AIDL服务。标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。
示例:
1、建立IMyService.aidl文件(一定要手动加上包名)
interface IMyService {
String getValue();
}
文件内容与java代码相似,但不能加修饰符(例如,public、private)和AIDL服务不支持的数据类型(例如,InputStresm、OutputStream)等内容;
2、ADT自动生成IMyService.java文件;
3、新建一个MyService类继承自Service,在类中定义一个内嵌类(MyServiceImpl),该类是IMyService.Stub的子类。
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class MyService extends Service {
public class MyServiceImpl extends Stub {
@Override
public String getValue() throws RemoteException {
return "Android is very powerful";
}
}
@Override
public IBinder onBind(Intent intent) {
// 必须返回MyServiceImpl类的对象实例,否则客户端无法获得服务对象
return new MyServiceImpl();
}
}
4、配置
<service android:name="MyService">
<intent-filter >
<action android:name="包名.IMyService"/>
</intent-filter>
</service>
5、编写客户端代码
新建一个工程,并将自动生成的IMyService.java文件连同包目录一起复制到新工程下。
public class MainActivity extends Activity implements OnClickListener{
private IMyService myService = null;
private TextView textView;
private static String TAG = "MainActivity";
private Button btn_invoke, btn_bind;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myService = Stub.asInterface(service);
btn_invoke.setEnabled(true);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_invoke = (Button) findViewById(R.id.btn_invoke);
btn_bind = (Button) findViewById(R.id.btn_bind);
btn_invoke.setEnabled(false);
textView = (TextView) findViewById(R.id.tv_text);
btn_invoke.setOnClickListener(this);
btn_bind.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_invoke:
try {
textView.setText(myService.getValue());
} catch (Exception e) {
}
break;
case R.id.btn_bind:
// 绑定AIDL服务
bindService(new Intent("包名.IMyService"),
serviceConnection, Context.BIND_AUTO_CREATE);
default:
break;
}
}
}
6、运行AIDL服务程序,然后运行客户端程序,单击bind按钮,如果绑定成功,invoke按钮变为可选状态,单击invoke按钮,会输出getValue方法的值,显示在TextView上。