Xamarin.Forms AndroidのBroadcast Receiverの使い方

こんにちは。レモンティーです。

今回はBroadcast Receiverを使ってみます。
sawalemounity.hatenablog.com


公式曰く

ブロードキャストレシーバーは、
アプリケーションが
Androidオペレーティングシステムまたは
アプリケーションによって
ブロードキャストされるメッセージ(Android Intent)に
応答できるようにするAndroidコンポーネントです。 

だそうです。
ちょっとMessagingCenterに似ていますが、
うまみはシステムが発する「充電が少なくなってます」
みたいなBroadcastを受信できるところですね。

さっそくやっていきます

Broadcast Receiverの追加

Androidプロジェクトに「追加」で
ブロードキャストレシーバーを追加します。

    [BroadcastReceiver]
    public class TestReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            Toast.MakeText(context, "Received intent!", ToastLength.Short).Show();
        }
    }

こんなのが追加されましたね。

IntentFilter等の設定

これをこのように書き換えます

    [BroadcastReceiver(Enabled =true)]
    [IntentFilter(new[] {
        Intent.ActionAirplaneModeChanged,
    })]
    public class TestReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            Toast.MakeText(context, "Received intent!", ToastLength.Short).Show();
        }
    }

↑のIntentFilterという配列は
このレシーバーがどのブロードキャストに反応するのか決定するものです。
今回はシステムが発する「機内モードのON・OFF」に反応します。
従来は手書きでAndroidManifestに書かないといけなかったのですが
Xamarin では自動でやってくれます。

これで機内モードをON・OFFすると
トーストを表示するBroadcastReceiverができました。

機内モード以外にもたくさん種類があります↓
hyoromo.hatenablog.com

自作ブロードキャストを発行

システム以外の普通のアプリもブロードキャストを送信しています。

当然自分のアプリからも送ることができます。

もしDependencyServiceでよびだすメソッド内で送信するなら

Intent intent = new Intent("test");
Forms.Context.SendBroadcast(intent);

となります。
Android.App.Application.Contextでもいけます。)

これを受け取るにはIntentFilterに↓のように追加します

    [BroadcastReceiver(Enabled =true)]
    [IntentFilter(new[] {
        Intent.ActionAirplaneModeChanged,
        "test",
    })]
    public class TestReceiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            Toast.MakeText(context, "Received intent!", ToastLength.Short).Show();
        }
    }

これでOKです。

なお、今回は簡単に"test"としていますが
これは"com.アプリ作者.アプリ名.任意の文字列"
とするのが正しいです。
"com.lemon.BroadcastTest.test"
みたいな感じですね。

また、SendBroadcastメソッドで送信したブロードキャストは
IntentFilterさえちゃんと設定すれば他のアプリからも
受け取れるので、自分で送信する際には注意が必要です。

自アプリ内のみの送信は
Xamarin Support Library v4 というNugetパッケージの
LocalBroadcastManagerで行うことができます。

その他の対策についてはAndroid公式が詳しいです。
記事冒頭の用語リンクから飛べます。

今回はこれでおしまいです。
sawalemounity.hatenablog.com

sawalemounity.hatenablog.com

sawalemounity.hatenablog.com