Service への AIDL のバインドの記述を省略または使い回したいと考えた。
IServiceAidlProcessor = AIDLインタフェースのメソッドを実行するプロセッサをインターフェースとして定義
AidlStubAsFactory = AIDL Stub の asInterface を実行してAIDLインスタンスを生成するためのAbstractFactoru
ServiceAidlClient = サービスのメソッドを AIDL で実行するクライアント
と用意する。
------------ IServiceAidlProcessor -------------------
public interface IServiceAidlProcessor<T>{
public void process(T service);
}
------------ AidlStubAsFactory -------------------
import android.os.IBinder;
/**
* AidlStubAsFactory
* 総称型 T は、AIDL インターフェースを指す。
*/
public abstract class AidlStubAsFactory<T>{
public abstract T create(IBinder binder);
}
------------ ServiceAidlClient -------------------
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
/**
* ServiceAidlClient<T>
* 総称型 T は、AIDL インターフェースを指定する
*/
public class ServiceAidlClient<T>{
Context mContext;
private Class<? extends Service> mServiceClass;
IServiceAidlProcessor<T> mProccesor;
T mBoundService;
AidlStubAsFactory<T> mFactory;
public ServiceAidlClient(Context context, Class<? extends Service> serviceClass,AidlStubAsFactory<T> factory){
mContext = context;
mServiceClass = serviceClass;
mFactory = factory;
}
public void execute(IServiceAidlProcessor<T> proccesor){
mProccesor = proccesor;
Intent intent = new Intent(mContext,mServiceClass);
intent.setAction(mServiceClass.getName());
mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
ServiceConnection mConnection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName className, IBinder binder){
mBoundService = mFactory.create(binder);
mProccesor.process(mBoundService);
mContext.unbindService(mConnection);
}
@Override
public void onServiceDisconnected(ComponentName className){
mBoundService = null;
}
};
}
(使用例)AIDL が、ISampleService.aidl で、Service が、SampleService の場合
ServiceAidlClient<ISampleService> client = new ServiceAidlClient<ISampleService>(
getApplicationContext()
,SampleService.class
,new AidlStubAsFactory<ISampleService>(){
@Override
public ISampleService create(IBinder binder){
return ISampleService.Stub.asInterface(binder);
}
}
);
client.execute(new IServiceAidlProcessor<ISampleService>(){
@Override
public void process(ISampleService service){
try{
// ISampleService.aidl のメソッドを実行
}catch(RemoteException e){
Log.e("MYTAG",e.getMessage(),e);
}
}
});