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(); } }
②上記カウントアプリを実行すると以下のような画面になります。再生ボタンをクリックするとテキスト部分が数字に変わり、押した回数を表示します。
もっと簡単に表示できる方法があればよいのですが、ひとまずこれでよしとしましょう。