【Android】BroadCastReceiverで受け取った情報をメインアクティビティのViewに表示する方法

BroadCastReceiverを使用したアプリを作成しようとしましたが、メインアクティビティに表示しようとすると例外が発生したり、表示が変わらなかったりしました。色々試した結果、唯一表示することに成功した結果を残しておこうと思います。

①Handlerクラスを使用することで、スレッド間の通信を行うことができるようです。以下のコードはMediaButtonIntentReceiver クラスからMainActivityクラスに文字列を送っています。

【activity_main.xml】

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.kinoshita.getearphonebutton.MainActivity">

    <TextView
        android:id="@+id/countText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="イヤホンの再生ボタンを押すとカウントを行います。" />
</RelativeLayout>
 

【MainActivity.java】

package com.example.kinoshita.getearphonebutton;

import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    // ↓↓↓ 今回ポイントとなった箇所 ↓↓↓
    // キーを基に値を受け取る
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg){
            Bundle bundle = msg.getData();
            String setText = bundle.getString("key"); // キーを指定してゲット
            TextView text = (TextView) findViewById(R.id.countText);
            text.setText(String.valueOf(setText));
        }
    };
    // ↑↑↑ 今回ポイントとなった箇所 ↑↑↑

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    MediaButtonIntentReceiver r = new MediaButtonIntentReceiver(handler);

    @Override
    public void onResume() {
        super.onResume();
        registerReceiver(r, new IntentFilter(Intent.ACTION_MEDIA_BUTTON));
        registerReceiver(r, new IntentFilter(Intent.ACTION_HEADSET_PLUG));
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(r);
    }
}

【MediaButtonIntentReceiver.java】

package com.example.User.getearphonebutton;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.widget.Toast;

public class MediaButtonIntentReceiver extends BroadcastReceiver {

    Handler receiverHandler = new Handler();

    public MediaButtonIntentReceiver(Handler handler) {
        super();
        receiverHandler = handler;
    }

    int count = 0;
    String setText;
    @Override
    public void onReceive(Context context, Intent intent) {
        String intentAction = intent.getAction();

        switch(intentAction)
        {
            case Intent.ACTION_HEADSET_PLUG:
                int state = intent.getIntExtra("state", -1);
                if (state == 0) {
                    Toast.makeText(context, "イヤホンが外されました。", Toast.LENGTH_SHORT).show();
                } else if (state > 0) {
                    // イヤホン・ヘッドセット(マイク付き)が装着された
                    Toast.makeText(context, "イヤホンが接続されました。", Toast.LENGTH_SHORT).show();
                }
                break;
            case Intent.ACTION_MEDIA_BUTTON:
                KeyEvent event =   (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
                if (event == null) {
                    return;
                }
                int action = event.getAction();
                if (action == KeyEvent.ACTION_DOWN) {
                    // 再生ボタンを押すとカウントを行う
                    setText = String.valueOf(++count);

                    // カウントを行った値をメインアクティビティに送信する
                    Message msg = new Message();
                    Bundle bundle = new Bundle();
                    bundle.putString("key",setText); //キーを指定してセット
                    msg.setData(bundle);
                    receiverHandler.sendMessage(msg);
                }
                break;
            default:
                break;
        }
        abortBroadcast();
    }
}

②上記カウントアプリを実行すると以下のような画面になります。再生ボタンをクリックするとテキスト部分が数字に変わり、押した回数を表示します。

%e8%b5%b7%e5%8b%95%e6%99%82  %e5%86%8d%e7%94%9f%e3%83%9c%e3%82%bf%e3%83%b3%e6%8a%bc%e4%b8%8b%e6%99%82

もっと簡単に表示できる方法があればよいのですが、ひとまずこれでよしとしましょう。