如果对service有多线程并发访问的需求,那就只能用AIDL来实现了,用android提供的自动生成工具,还是比较容易实现的。
//IServiceDemo.aidl
package com.example.servicedemo;
interface IServiceDemo {
void sayHello();
}
我用的配置好的eclipse,编译的时候在gen目录下会自动帮生成IServiceDemo.java. 会看到里面多了Stub和Proxy,对进程间通信做了封装,这里就不多说了。使用aidl实现serivce的时候有一个特别注意的地方,在有进程bind上service的时候,会马上返回,但是aidl是没有做进程安全的,需要使用者自己来好保护。
/ServiceDemo.java
IServiceDemo mBinder2 = null;
ServiceConnection mConnectionAidl = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
try {
mBinder2 = IServiceDemo.Stub.asInterface(service);
mBinder2.sayHello();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
};
private void bindAidlService() {
Intent service = new Intent(this, ServiceDemo.class);
this.bindService(service, mConnectionAidl, Service.BIND_AUTO_CREATE);
}
private void unbindAidlService () {
if(mConnectionAidl != null)
this.unbindService(mConnectionAidl);
}
}
这里有一个问题,aidl文件里只能用基本的数据类型,那我想传递或者返回一个封装好的类对象了该怎么办呢?且听下回分解。