Closed6

[C# / MAUI Blazor] 定期実行したい

あざらしあざらし

バックグラウンド定期実行(下記は失敗!!!!!!!!!!!!!)

今回のアプリはサーバーと裏で定期的に連携する、という要件があるので実装したい

使う技術としては WorkManager がよさそう?
https://developer.android.com/topic/libraries/architecture/workmanager?hl=ja

MAUI Blazor で WorkManager を使うには、Xamarin.AndroidX.Work.Runtimeが必要
⇒NuGetからXamarin.AndroidX.Work.Runtimeをインストール……と思ったけど、インストールできなかった。依存関係のパッケージのバージョンが古いから
下記のように警告もでている

NU1605: エラーとして警告: Xamarin.AndroidX.Lifecycle.LiveData の 2.6.2.1 から 2.5.1.1 へのパッケージ ダウングレードが検出されました。別のバージョンを選択するには、プロジェクトから直接パッケージを参照してください。 
 WorkManagerTest -> Xamarin.AndroidX.Work.Runtime 2.8.1.4 -> Xamarin.AndroidX.Lifecycle.LiveData (>= 2.6.2.1) 
 WorkManagerTest -> Xamarin.AndroidX.Lifecycle.LiveData (>= 2.5.1.1)

んで、Xamarin.AndroidX.Lifecycle.LiveDataのバージョンをあげようとおもったら「プロジェクトによってブロック」とか出てバージョン変えられへん( ゚Д゚)

仕方ないので、Xamarin.AndroidX.Work.Runtimeの最新ではなく、「2.7.1.5」バージョンをインストールした

次に、MainActivity.cs に下記のように加える

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);    
    ScheduleWorkManagerJob();
}
private void ScheduleWorkManagerJob()
{
    var workManager = WorkManager.GetInstance(this);

    // ここで定期的に実行したい処理を指定
    var workRequest = PeriodicWorkRequest.Builder.From<YourWorker>(TimeSpan.FromMinutes(15))
        .Build();

    workManager.Enqueue(workRequest);
}

YourWorkerクラスを定義する

public class YourWorker : Worker
{
    public YourWorker(Context context, WorkerParameters workerParams) : base(context, workerParams)
    {
    }

    public override Result DoWork()
    {
        // ここに30分ごとに実行したい処理を記述
        // 例えば、1カウントUPの処理など

        Console.WriteLine("WorkManager job executed.");

        return Result.InvokeSuccess();
    }
}

これで、TimeSpan.FromMinutes(15)にあるとおり、15分毎にDoWork()が実行されるようになる

あざらしあざらし

2023年11月14日

定期実行されないんだけどォ!?!?!!?!?!??????

あざらしあざらし

ということなので、別の方法でチャレンジしてみようと思う。
別の方法として考えられるのは下記

  • AlarmManager
  • JobScheduler
  • WorkManager -> これはうまくいかず・・・

なんでうまくいかなかったんだろう?
推測になってしまうけど、Xamarin.AndroidX.Work.Runtime のバージョンが古いからなのかな…???と思ったり。。。

あざらしあざらし

AlarmManager を使ってみる

AlermManager は BroadcastReceiver を使用して実際の処理を実行する


① OnCreate の中で Hogehoge を呼び出す
ここで、BroadcastReceiver を設定して、アラームのセットアップを行う
※今回は Fugafuga class の中の OnReceive をターゲットにする

private void Hogehoge()
{
            AlarmManager alarmManager = (AlarmManager)GetSystemService(Context.AlarmService);

        // アラームが発動した際に呼ばれるBroadcastReceiverを設定
        Intent intent = new Intent(this, typeof(Fugafuga));
        PendingIntent pendingIntent = PendingIntent.GetBroadcast(this, 0, intent, 0);

        // アラームを1時間ごとにセットアップ
        long interval = AlarmManager.IntervalHour;
        alarmManager.SetRepeating(AlarmType.RtcWakeup, DateTime.Now.Millisecond, interval, pendingIntent);
}

② BroadcastReceiver で受け取る

[BroadcastReceiver(Enabled = true)]
    internal class Fugafuga : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            // 定期処理したい処理を呼び出す
        }
    }
あざらしあざらし

…が、これでもできなかった(エラーがでた)

ぬぁんで!?


ということで、

Xamarin.AndroidX.Work.Runtime のバージョンが古いからなのかな…???

これを疑ってみることにした


今の症状としては、
Xamarin.AndroidX.Work.Runtime のアップグレードは、
依存関係のある Xamarin.AndroidX.Lifecycle.LiveData のアップグレードと共に失敗している

そうすると、今のAndroidのバージョンとは合っていない…??
⇒ AndroidManifest.xml から、Application target の version を少し下げてみる
具体的には、「Android 12.0 (API level 31)」-> 「Android 11.0 (API level 30)」

⇒これで定期実行するようになった!

うーん、、、不服(´・ω・`)
だけどこれ以上沼ると業務の進捗だめですになってしまうので原因追及はストップ

このスクラップは5ヶ月前にクローズされました