Xamarin.Forms AlarmManagerで指定時間にServiceを開始

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

前回はServiceを普通に開始してみました
sawalemounity.hatenablog.com


今回はAlarmManagerでServiceを開始します。
知らない単語がでてきたら↓をどうぞ
sawalemounity.hatenablog.com


ではさっそくやっていきます。

Service作成

まず開始するサービスをつくります。
普通にクラスを追加してIntentServiceを継承します。
今回は↓。前回とかわりませんね。

[Service]
    public class TestService:IntentService
    {
        const int NOTIFICATION_ID = 9000;

        public TestService() : base("TestService")
        {

        }

        protected override void OnHandleIntent(Intent intent)
        {
            //処理

            Notification.Builder notificationBuilder = new Notification.Builder(Android.App.Application.Context)
           .SetSmallIcon(Resource.Drawable.icon)
           .SetContentTitle("Test")
           .SetContentText("This is a test notification!");

            var notificationManager = (NotificationManager)GetSystemService(NotificationService);
            notificationManager.Notify(NOTIFICATION_ID, notificationBuilder.Build());
            
        }
    }

Intent作成

先ほどつくったサービスを渡してIntentをつくります。
今回、これ以降はDependencyServiceで呼ぶメソッドに書いています。

Intent intent = new Intent(Android.App.Application.Context, typeof(TestService));

PendingIntent作成

さっきのIntentを渡してPendingIntentをつくります。

 PendingIntent pendingIntent = PendingIntent.GetService(Android.App.Application.Context, 0,intent,PendingIntentFlags.UpdateCurrent);

AlarmManagerを作成してセット

まず作成して…

 AlarmManager alarmManager = (AlarmManager)Android.App.Application.Context.GetSystemService(Context.AlarmService);

発火する時間をつくります。↓だと20秒後です。

 long fireTimeUtc = DateTimeOffset.UtcNow.AddMilliseconds(20 * 1000).ToUnixTimeMilliseconds();

で、セット

alarmManager.Set(AlarmType.RtcWakeup, fireTimeUtc, pendingIntent);

これで完了です。


ただし今回は簡単にするためにAPIごとの違いをスルーしています。
そのため実際には↓の内容に注意して
APIごとにセットするときのメソッドを変えるなどの
工夫が必要になります。(↓の最後に簡潔な例があります)
qiita.com


今回はこれでおしまいです。

sawalemounity.hatenablog.com

sawalemounity.hatenablog.com