【Xamarin】【Android】Broadcastを受け取る

Xamarin.AndroidでBroadcast(同報信号)を受け取るための方法です.いろんなデータがBroadcastされているようですね.

今回はとりあえずバッテリーのデータを受け取ってみようと思います.

環境

僕の開発環境です.

  • Xperia XZ1
  • Android 9.0
  • Xamarin.Android
  • Visual Studio for mac

レシーバーの実装

Broadcastを受け取るには,BroadcastReceiverを継承したclassを実装する必要があります.とりあえずコードを書いていきましょう.....と言いたいところですが,Visual Studio(for mac)では,コンテキストメニューから直接BroadcastReceiverを継承したclassを生成することができます.

プロジェクトを右クリック > 追加 > 新しいファイル > Android > ブロードキャストレシーバー > 新規

はい.これだけで受信するためのclassは完成です.何ともあっけない.....

本来であれば,AndroidManifest.xmlに記述する必要があるのですが,この方法ではそれが必要ありません.便利な世の中になりましたね.

念のために実際のコードを

using Android.Content;
using Android.OS;
using Android.Widget;

namespace ReceiverSample {
 [BroadcastReceiver]
 public class receiver : Android.Content.BroadcastReceiver {
  public override void OnReceive(Context context, Intent intent) {
   Toast.MakeText(context, "Received intent!", ToastLength.Short).Show();
   // intentの種類を判別
   if(intent.Action == Intent.ActionBatteryChanged) {
    // データ付きintentとしてバッテリー情報が与えられる
    MainActivity.Update(intent.GetIntExtra(BatteryManager.ExtraLevel, -1 ));
   }
  }
 }
}

レシーバの登録

次に,レシーバを登録してあげる必要があります.簡単です.とりあえずコードを見てみましょう.

using Android.App;
using Android.OS;
using Android.Runtime;
using Android.Content;
using Android.Support.V7.App;
using Android.Widget;

namespace ReceiverSample {
 [Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)]
 public class MainActivity : AppCompatActivity {
  static TextView tv;

  protected override void OnCreate(Bundle savedInstanceState) {
   base.OnCreate(savedInstanceState);
   Xamarin.Essentials.Platform.Init(this, savedInstanceState);
   SetContentView(Resource.Layout.activity_main);

   tv = FindViewById(Resource.Id.tv1);

   receiver receiver = new receiver();  // receiverのインスタンスを作成
   IntentFilter filter = new IntentFilter();  // Intentのフィルタを作成(BroadcastはIntentで飛んでくる)
   filter.AddAction(Intent.ActionBatteryChanged);  // フィルタの設定
   RegisterReceiver(receiver, filter);  // receiverを登録
			
  }

  public static void Update(int _level) {
   tv.Text = _level.ToString() + "%";
  }

  public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) {
   Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

   base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
  }
 }
}

レイアウト

念のためにレイアウトも載せとく.


 
 
 

実行結果

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です