在Android中, 每个应用程序都有自己的进程,当需要在不同的进程之间传递数据时,该如何实现呢? 在Android中, 采用AIDL(Android Interface Definition Language:接口定义语言)方式实现。
AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通信(IPC)。
//先来讲一下利用bindService调用服务里面的方法:
//DemoActivity:
public class DemoActivity extends Activity implements OnClickListener {
private Button bt_bind_service;
private Button bt_unbind_service;
private Button bt_call_service;
private Intent intent;
private MyConn conn;
private IService iService;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt_bind_service = (Button) this.findViewById(R.id.button3);
bt_unbind_service = (Button) this.findViewById(R.id.button4);
bt_call_service = (Button) this.findViewById(R.id.button5);
bt_bind_service.setOnClickListener(this);
bt_unbind_service.setOnClickListener(this);
bt_call_service.setOnClickListener(this);
intent = new Intent(this, MyService.class);
conn = new MyConn();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button3: // 绑定服务
bindService(intent, conn, Context.BIND_AUTO_CREATE);
break;
case R.id.button4: // 解除绑定服务
unbindService(conn);
break;
case R.id.button5: // 调用服务里面的方法
iService.callMethodInService();
break;
}
}
private class MyConn implements ServiceConnection {
//当服务绑定成功后,会调用这个方法。
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iService=(IService) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
@Override
protected void onDestroy() {
unbindService(conn);
super.onDestroy();
}
}
//MyService:
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
public class MyBinder extends Binder implements IService{
@Override
public void callMethodInService() {
sayHelloInService();
}
}
public void sayHelloInService(){
System.out.println("Hello in Service");
}
}
//IService:
public interface IService {
public void callMethodInService();
}
/*
步骤总结:
①创建一个服务,这个服务里面有一个要被调用的方法,sayHelloInService()
②定义一个接口IService,接口里面有一个抽象方法,这个抽象方法的作用
就是去调用的sayHelloInService().
③在MyService中定义一个MyBinder类,继承Binder,实现IService,
实现IService中的抽象方法。在onBind()方法中把MyBinder对象返回。
④在Activity中定义一个类MyConn实现ServiceConnection接口,并实现
该接口中的onServiceConnected()方法,
这个方法有一个参数IBinder service,也就是说,当Activity绑定服务成功时,
会调用这个onServiceConnected()方法,该方法中的IBinder类型的参数,
就是MyService中的onBind()方法返回的Binder对象,而这个Binder对象又实现
了IService接口,所以在Activity中定义一个private IService iService..........
然后把IBinder service赋给iService,强转成IService。
注意:Binder是IBinder的子类。
⑤在Activity中通过bindService()开启服务
⑥绑定服务后就可以在Activity中通过iService.callMethodInService()调用Service里面的
方法。
*/
//接下来讲AIDL
public class DemoActivity extends Activity {
IService iService;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = new Intent();
intent.setAction("cn.itcast.remoteservice");
bindService(intent, new MyConn(), BIND_AUTO_CREATE);
}
public void click(View view){
try {
// 调用了远程服务的方法
iService.callMethodInService();
} catch (RemoteException e) {
e.printStackTrace();
}
}
private class MyConn implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iService = IService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
//RemoteService中:
public class RemoteService extends Service {
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
private class MyBinder extends IService.Stub{
@Override
public void callMethodInService() throws RemoteException {
sayHelloInService();
}
}
/**
* 服务里面的一个方法
*/
public void sayHelloInService(){
System.out.println("hello in service");
}
}
//IService中:
interface IService {
void callMethodInService();
}
/*
步骤总结:
①创建一个服务,这个服务里面有一个要被调用的方法,sayHelloInService()
②定义一个接口IService,接口里面有一个抽象方法,这个抽象方法的作用
就是去调用的sayHelloInService().
关键:把接口中定义的访问权限如public都要删除掉。
把IService.java文件的后缀名改为aidl
③在RemoteService中定义一个MyBinder类,继承IService.Stub,
在onBind()方法中把MyBinder对象返回。
④在DemoActivity所在的工程中新建一个包,包名就是IService.aidl原来的包名
然后把IService.aidl从其所在的工程拷贝到DemoActivity所在工程。
⑤在Activity中定义一个类MyConn实现ServiceConnection接口,并实现
该接口中的onServiceConnected()方法,
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iService = IService.Stub.asInterface(service);
}
⑥开启服务:
Intent intent = new Intent();
intent.setAction("cn.itcast.remoteservice");
bindService(intent, new MyConn(), BIND_AUTO_CREATE);
⑦调用远程服务的方法:
iService.callMethodInService();
*/