AIDL バインド使用を簡単にすることを検討

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);
       }
    }
 });