[C# / MAUI Blazor] 定期実行したい
バックグラウンド定期実行(下記は失敗!!!!!!!!!!!!!)
今回のアプリはサーバーと裏で定期的に連携する、という要件があるので実装したい
使う技術としては WorkManager がよさそう?
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)」
⇒これで定期実行するようになった!
うーん、、、不服(´・ω・`)
だけどこれ以上沼ると業務の進捗だめですになってしまうので原因追及はストップ
一応動くようになったのでクローズ…