package com.devsmart.android; import java.lang.reflect.Method; import android.app.Service; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.os.IInterface; import android.util.Log; public class ServiceBinder<T extends IInterface> { private Class<? extends Service> mServiceClass; private Class<? extends IInterface> mInterfaceClass; private T mServiceInterface; private Context mContext; private Runnable mOnServiceReady; public ServiceBinder(Context context, Class<? extends Service> serviceClass, Class<? extends IInterface> interfaceClass, Runnable onServiceReady) { mContext = context; mServiceClass = serviceClass; mInterfaceClass = interfaceClass; mOnServiceReady = onServiceReady; Intent serviceIntent = new Intent(context, mServiceClass); context.bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE); } public void unBind(){ mContext.unbindService(mServiceConnection); } public T getServiceInterface() { return mServiceInterface; } private ServiceConnection mServiceConnection = new ServiceConnection() { @SuppressWarnings("unchecked") @Override public void onServiceConnected(ComponentName name, IBinder service) { try { Method asInterface = null; for(@SuppressWarnings("rawtypes") Class c : mInterfaceClass.getClasses()) { String className = c.getSimpleName(); if(className.equals("Stub")) { asInterface = c.getMethod("asInterface", IBinder.class); break; } } mServiceInterface = (T)asInterface.invoke(null, service); if(mOnServiceReady != null) { mOnServiceReady.run(); } }catch(Exception e) { Log.e(ServiceBinder.class.getName(), "Unable to bind to service", e); } } @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } }; }