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



