ブロードキャストレシーバの実装によるアクティビティとサービスの通信
サービスはバックエンドで処理を行います。例えばサービスで処理が完了したタイミングで画面にメッセージを表示したい場合等、サービスとアクティビティとのやりとりを行いたいときは、どうしたらよいでしょうか。
ここではブロードキャストレシーバでそれを実現する方法を紹介します。
ブロードキャストレシーバーの利用
アンドロイドではインテントをブロードキャストする仕組みがあります。ブロードキャストされたインテントは、ブロードキャストレシーバにて受け取れます。
registerReceiver でインテントフィルタとブロードキャストレシーバーを登録します。すると、そのインテントを指定したレシーバーで受け取れるようになります。
サービス側では特定のインテントをブロードキャストすることによって、アクティビティ側でそれを受けとることができる、ということになります。
ここではサービス終了時に、次のような Toast メッセージを表示するサンプルプログラムを書きます。
"Hello, Broadcast!" という文字はサービスからインテントに付随させて送信して、レシーバーで受け取ったものです。
ブロードキャストレシーバーの作成
BroadcastReceiver から派生して、onReceive をオーバーライドします。
package com.keicode.android.test;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
String message = bundle.getString("message");
Toast.makeText(
context,
"onReceive! " + message,
Toast.LENGTH_LONG).show();
}
}
ブロードキャストレシーバの登録
インテントフィルタとブロードキャストレシーバーを作成します。
package com.keicode.android.test;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ServiceTest4 extends Activity {
final static String TAG = "ServiceTest4";
Button startButton;
IntentFilter intentFilter;
MyBroadcastReceiver receiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startButton = (Button)findViewById(R.id.start_button);
startButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
startService(new Intent(getBaseContext(), MyIntentService.class));
}
});
receiver = new MyBroadcastReceiver();
intentFilter = new IntentFilter();
intentFilter.addAction("MY_ACTION");
registerReceiver(receiver, intentFilter);
}
}
サービスからのブロードキャストの送信
sendBroadcast メソッドでブロードキャストを送信します。
package com.keicode.android.test;
import android.app.IntentService;
import android.content.Intent;
public class MyIntentService extends IntentService {
final static String TAG = "ServiceTest4";
public MyIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
try {
Thread.sleep(10000);
Intent broadcastIntent = new Intent();
broadcastIntent.putExtra(
"message", "Hello, BroadCast!");
broadcastIntent.setAction("MY_ACTION");
getBaseContext().sendBroadcast(broadcastIntent);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
ちなみに、システム起動時に処理をスケジューリングするような場合は、このブロードキャストレシーバでブートが完了した (BOOT_COMPLETED) というブロードキャストを受け取り、 そのタイミングでサービスのスケジュールを行います。これに付いてはまた別の記事で説明します。