ブロードキャストレシーバの実装によるアクティビティとサービスの通信

サービスはバックエンドで処理を行います。例えばサービスで処理が完了したタイミングで画面にメッセージを表示したい場合等、サービスとアクティビティとのやりとりを行いたいときは、どうしたらよいでしょうか。

ここではブロードキャストレシーバでそれを実現する方法を紹介します。

ブロードキャストレシーバーの利用

アンドロイドではインテントをブロードキャストする仕組みがあります。ブロードキャストされたインテントは、ブロードキャストレシーバにて受け取れます。

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) というブロードキャストを受け取り、 そのタイミングでサービスのスケジュールを行います。これに付いてはまた別の記事で説明します。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Android 開発入門