服务端代码:
第一定义一个service工程,用于启动一个服务。在该工程源码下定义一个aidl文件。
package com.example.service;
interface DataService{
double getData(String arg);
}
必须要有包名。
public class MainActivity extends Activity {
private Button btn=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button)this.findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 启动一个服务
Intent intent=new Intent(MainActivity.this,MyService.class);
startService(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
public class MyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
//返回binder由didl文件生成
return binder;
}
//定义给客户端调用的方法 (aidl文件)
Binder binder=new DataService.Stub() {
@Override
public double getData(String arg) throws RemoteException {
if(arg=="a"){
return 1;
}
if(arg=="b"){
return 2;
}
return 0;
}
};
}
客户端代码:
要把服务端aidl文件拷贝到客户端
public class MainActivity extends Activity {
private Button btn1,btn2;
//定义一个AIDL实例
private DataService dataService;
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1=(Button)this.findViewById(R.id.button1);
btn2=(Button)this.findViewById(R.id.button2);
tv=(TextView)this.findViewById(R.id.textView1);
//绑定服务
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(DataService.class.getName());
//启动服务
bindService(intent, conn, BIND_AUTO_CREATE);
}
});
//调用服务的方法
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
int result=(int) dataService.getData("a");
tv.setText(result+"");
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
//客户端与服务交互
private ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//传入service
dataService=DataService.Stub.asInterface(service);
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
在配置文件:
<service
android:name="com.example.android_aidl_service.MyService"
>
<intent-filter>
<!-- 意图过滤器要把aidl包名加类名 -->
<action android:name="com.example.service.DataService"/>
</intent-filter>
</service>