ServiceのBindについて

( ノ゚Д゚)こんにちわ

今回はServiceのBindについて簡単にお話します。

Androidにバックグラウンドで動くサービスというプロセスがあり、バックグラウンドで

動いているためアプリ画面に処理結果などを直接反映することができません。

※Intentで投げたり方法としてはあります。

しかし!そのサービスとアプリ画面(Activity)を関連づけるbindServiceなるものを使えば簡単に処理結果を表示することができます。

SampleBindService ← 超簡単なサンプルソース

サービスを関連づけるポイントは4つ

  1. ActivityとServiceのinterfaceとなるaidlを作る
  2. Serviceでbindされたときにinterfaceのインスタンスを返す
  3. ActivityとServiceで接続が成功したら、Serviceから受け取ったインスタンスを変数へ格納する
  4. AndroidManifest.xmlにサービスを設定する

以上の4点をすることで動きます。

超簡単なサンプルを見ていただくと40行くらいしか書いていないですが動きます。

「1.」から簡単に説明します。

[java highlight=”4″]
package com.heibon.app.sample.bindservice;

interface IJoinBindService {
String joinText(String text1, String text2);
}
package com.heibon.app.sample.bindservice;

interface IJoinBindService {
String joinText(String text1, String text2);
}
[/java]

aidlのパッケージ名とインターフェースとしてのメソッド名を記載します。

ファイル名には、必ず「.aidl」とつけてください!←これ重要です

次に「2.」のインスタンスを返す処理です。

[java firstline=”9″ highlight=”9,20″]
private final IJoinBindService.Stub _Stub = new IJoinBindService.Stub() {
@Override
public String joinText(String text1, String text2) throws RemoteException {
// 文字列を結合して返す
return text1 + text2;
}
};

@Override
public IBinder onBind(Intent intent) {
// Stubのインスタンスを返す
return _Stub;
}
[/java]

ハイライトにしていある9行目のインスタンスをバインドされた時に20行目で返すという処理です。

「3.」の処理は以下で。

[java firstline=”57″ highlight=”66,69″]
_ServiceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
_IBind = null;
_IsBind = false;
}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
_IBind = IJoinBindService.Stub.asInterface(service);
}
};
_IsBind = bindService(new Intent(getApplicationContext(), JoinService.class), _ServiceConnection, BIND_AUTO_CREATE);
[/java]

69行目でサービスのバインドをして、66行目でServiceとの接続が出来たのでインスタンスを変数へ格納しています。

 

あとはボタンを押された時の処理を書くだけです。

[java firstline=”40″ highlight=”45″]
public void onClick(View arg0) {
if (_IsBind) {
String text1 = _Et1.getText().toString();
String text2 = _Et2.getText().toString();
try {
String result = _IBind.joinText(text1, text2);
_TvResult.setText(result);
} catch (RemoteException e) {
e.printStackTrace();
_TvResult.setText("ERROR");
}
}
}
[/java]

ボタンが押されたら45行目のようにサービスから受け取ったインスタンスを使用してサービスに処理してもらい、計算結果を受け取っています。

 

実装自体は簡単ですが、分からない点がありましたらコメントを残してください。

では(つ∀-)オヤスミー

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です