Android サービスをバインドする bindService

Androidではサービスとの通信手段として、バインドサービス(bindService)があります。バインドサービスにより、アプリはバックグラウンドで動作するサービスと通信し、リクエストの送信やデータの取得などを行うことが可能です。

サービスをバインドするには、まずアプリケーションのコードでServiceConnectionオブジェクトを作成し、サービスの接続状態をリッスンします。次に、bindService()メソッドを呼び出してサービスをバインドします。このメソッドは、バインドするサービスのIntentオブジェクトと前に作成したServiceConnectionオブジェクトの2つのパラメータを受け取ります。

サービスをバインドする方法の例を以下に示します:

// 创建一个 ServiceConnection 对象
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 当服务连接成功时,会调用该方法
// 在该方法中可以获取到与服务交互的 Binder 对象
MyService.MyBinder binder = (MyService.MyBinder) service;
MyService myService = binder.getService();
// 可以调用服务提供的方法
myService.doSomething();
}
@Override
public void onServiceDisconnected(ComponentName name) {
// 当服务断开连接时,会调用该方法
}
};
// 绑定服务
Intent intent = new Intent(this, MyService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

上記の例では ServiceConnection オブジェクトである mConnection を作成し、onServiceConnected() メソッドと onServiceDisconnected() メソッドをオーバーライドしている。onServiceConnected() メソッドの中で、サービスとやり取りを行う Binder オブジェクトを取得することができ、それを使ってサービスオブジェクトを取得し、対応するメソッドをコールすることができる。

最後に bindService() メソッドを呼び出してサービスをバインドします。最初の引数はバインドするサービスの Intent オブジェクト、2 番目の引数は先ほど作成した ServiceConnection オブジェクトです。3 番目の引数はサービスが存在しないときに自動的に作成するかどうかを表します。

サービスとの通信が不要になった時点で、unbindService()メソッドを呼び出してバインドを解除できます。

バインド処理は非同期処理なので、バインドに成功した後に onServiceConnected() メソッドがコールバックされます。そのため、サービスのメソッドをバインド直後に呼び出すと null ポインタ例外が発生する可能性があるので、 onServiceConnected() メソッド内で実行するようにしてください。

bannerAds