同一プロセス内の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()を呼び出せたことが確認できました。