关于Android IDL的知识 可阅读《Google Android 揭秘》的P104页,也可参见ApiDemos中的代码
其他的不说,直接上代码。
1.先写一个.aidl远程接口
package com.originatechina; //定义包
interface ISimpleMathService { //声明接口名称
int add(int a, int b); //描述方法
}
在eclipse 它会自动在gen文件夹对应的包下生成ISimpleMathService.java文件。
2.公开远程接口
package com.originatechina;
//导入相应的包
public class SimpleMathService extends Service {
// 实现远程接口
private final ISimpleMathService.Stub binder = new ISimpleMathService.Stub() {
@Override
public int add(int a, int b) throws RemoteException {
return a + b;
}
};
@Override
public IBinder onBind(Intent intent) {
return this.binder; // 返回一个表示远程接口的对象 IBinder
}
}
3.绑定到服务
package com.originatechina;
//导入相应的包
public class MainActivity extends Activity {
private ISimpleMathService service; // 定义远程接口类型变量
private boolean bound; // 定义表示绑定状态的布尔变量
private Button addButton; //请先在布局文件中添加一个按钮组件
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder iservice) {
service = ISimpleMathService.Stub.asInterface(iservice);
bound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
service = null;
bound = false;
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
addButton = (Button) findViewById(R.id.add_btn); // 省略获取View部分
addButton.setOnClickListener(listener);
}
private OnClickListener listener = new OnClickListener(){
@Override
public void onClick(View v) {
int a = 10;
int b = 20;//省略从布局中获取字符串 并转换为int类型
//doBindService();
//不能置于此处,否则onServiceConnected()还来不及调用,
//service为null,以下语句抛空指针异常
//可放在onCreate() 或者 onStart() 里面
try {
int result = service.add(a, b); // 使用远程对象执行操作
Toast.makeText(MainActivity.this, "" + a + "+" + b + "=" + result, 2000).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
@Override
public void onStart() {
super.onStart();
doBindService();
}
@Override
public void onStop() {
super.onStop();
doUnbindService();
}
void doBindService() {
if(!bound) {
bindService(new Intent(this, SimpleMathService.class),
connection,
Context.BIND_AUTO_CREATE); //建立绑定
}
}
void doUnbindService() {
if(bound) { // 解除绑定
unbindService(connection);
}
}
}
4. 在AndroidManifest.xml中定义你的service
<service android:name=".SimpleMathService" />
然后运行即可。