同一プロセス内のServiceへのバインド
Serviceへのバインドには必ずAIDLが必要なのかと思ってたんですが、同一プロセス内であればAIDLは不要みたいです。勘違いしてました。
下記の記事を読んで知りました。
なお、このケースではサービスとクライアントが同じプロセスなので、AIDLを使わなくても問題ありません。
常駐アプリが作成できるAndroidの“サービス”とは (2/3) - @IT
Bound Services | Android Developers
Android DevelopersのBound Servicesでローカルなサービス(リモートでない)について記載されています。
アクティビティから、直接サービスのメソッドを呼び出せるか試します。
バインドされるサービス
onBindで、Binderの実装クラスを返します。接続した側が、Serviceの参照を触れるよう、Binderの実装クラスにServiceの参照を返すメソッドを持たせます。
public class SampleService extends Service { public class SampleServiceBinder extends Binder { SampleService getService() { return SampleService.this; } } @Override public IBinder onBind(Intent intent) { Log.v(TAG, "service onBind"); return new SampleServiceBinder(); } public String hoge() { return "hoge"; }
サービスにバインドするアクティビティ
bindServiceによりServiceConnection#onServiceConnected()が呼ばれ、パラメータにService#onBindの戻り値が渡されるので、キャストしてgetServiceからserviceのインスタンスを取得します。
public class SampleAppActivity extends Activity { private static final String TAG = "hoge"; protected SampleService mService; @Override public void onCreate(Bundle savedInstanceState) { Log.v(TAG, "activity onCreate"); super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn4 = (Button) findViewById(R.id.button4); btn4.setOnClickListener(new OnClickListener() { public void onClick(View v) { Log.v(TAG, "btn4 onClick"); Intent intent = new Intent(); intent.setClass(getApplicationContext(), SampleService.class); bindService(intent, conn , Service.BIND_AUTO_CREATE); } }); Button btn5 = (Button) findViewById(R.id.button5); btn5.setOnClickListener(new OnClickListener() { public void onClick(View v) { Log.v(TAG, "btn5 onClick"); if(mService != null) { String hoge = mService.hoge(); text1.setText(hoge); } } }); } private ServiceConnection conn = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder binder) { Log.v(TAG, "onServiceConnected"); mService = ((SampleServiceBinder) binder).getService(); } public void onServiceDisconnected(ComponentName name) { Log.v(TAG, "onServiceDisConnected"); mService = null; } };
btn5をクリックするとSampleService#hoge()を呼び出せたことが確認できました。