ブロードキャストでダイアログを表示する

AndroidのBroadcastReceiverで送られてきたブロードキャストをキャッチして、ダイアログを表示する話。3日ハマりました。
Android難しい…

  • Forgroundの際にダイアログを表示してブロードキャストを投げ返す
  • Backgroundの時にはブロードキャストだけ投げ返す

いろんなところで紹介されてたやつ

AppManufest

<receiver android:name=".DataUpdateBroadcastReceiver">
        <intent-filter>
            <action android:name="受け取る時のkey"></action>
        </intent-filter>
      </receiver>

DataUpdateBroadcastReceiverクラス

Mpublic class DateUpdateBroadcastReceiver extends BroadcastReceiver{
	@Override
	public void onReceive(Context context, Intent intent){
		//やりたい処理
	}
}

いろんなワードを使って検索をかけたのですが、Androidでブロードキャストを受け取る処理で一番ヒットしたのがこの書き方でした。

AppManufestに受け取るクラスを書いておいてonRecdiveメソッドの中で処理を行う。

問題点

しかしこれには問題点がありました、ダイアログを出すことができませんでした。Androidについての理解がまだあやふやですが、UIを表示する部分などはActivityでやらないといけないみたいです。

Toastを出すとか、ブロードキャストを投げ返すだけだったらこの方法でいいのですがダイアログを出すのは無理です。

Activityで呼び出す方法

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

上記のURLではAppManufestには登録せず、ActivityでregisterReceiverを登録することで呼び出しを行なっています。

onReceiveに行くのはかわらないんですが、Handlerに値をセットしておくことで、Activityでのダイアログ表示ができます。

Inform Activity from a BroadcastReceiver ONLY if it is in the foreground

上記のURLはクラスを作成せずにActivityの中でBroadcastReceiverを作成してActivityを呼び出す例です。

しかしこの2つにも問題点が存在します。

問題点

アプリがForgroundの場合は全てダイアログを表示することができるが、アプリがBackgroundの時のアプリがKIllされている(アプリの履歴が消されている)場合にブロードキャストを送り返すことができませんでした。

最終的に

ブロードキャストを2つ同時に流したくはなかったので、ブロードキャストをされて、ForgroundだったらActivityの内部クラスにあるLocalBroadCastを使ってアプリ間でブロードキャストを投げるようにしました。

BroadcastReceiverを継承したクラスのonReceiveではmyApplication.isApplicationInForeground()これで判定を行ってそのまま飛ばすか、ダイアログを出すためにActivityに飛ばすかを判定しています

AppManufest

AppManufestははじめに書いていたものと同じです。

<receiver android:name=".DataUpdateBroadcastReceiver">
        <intent-filter>
            <action android:name="受け取る時のkey"></action>
        </intent-filter>
      </receiver>

BroadcastReceverのクラス

    @Override
    public void onReceive(Context context, Intent intent) {
        LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(context.getApplicationContext());
        MyApplication myApplication = (MyApplication) context.getApplicationContext();
        if (myApplication.isApplicationInForeground()) {
            Intent mIntent = new Intent("ローカルにブロードキャストするアクションキー");
            localBroadcastManager.sendBroadcast(mIntent);
        } else {
            Intent mIntent = new Intent("ブロードキャストを送り返すアクションキー");
            context.sendBroadcast(mIntent);
        }
    }

Activityでローカルブロードキャストを受け取る

Activityに関しては下記のサイトのコードを使わせてもらいました。ほとんど同じなのでコードは割愛します。