Windows Phoneアプリにはバックグラウンドエージェントと呼ばれる常駐処理的な仕組みがあります。
具体的にはPeriodicTaskというクラスを介してエージェントタスクを登録しておくと、アプリが起動していない状態でもおよそ30分間隔で処理を定期的に実行することができるようになる、というものです。
リファレンスをみても分かる通り、PeriodicTaskにはリソースや機能面で数々の制約が存在するのですが、なかでも「2週間ごとに再スケジュールが必要」という仕様がとても厄介。
「再スケジュール」というと分かりにくいかもしれませんが、要は「2週間に最低でも一回はアプリを起動する必要がある」ということです。
2週間アプリを起動しなかった場合、バックグラウンドエージェントは停止してタスク実行されなくなるのです。
「2週間も起動していないんだから使ってないんだろ、バッテリの無駄遣いだから止めてあげるね♪」ということなのでしょうが、モノによっては余計なお世話的な仕様であることは否めません。
実際、我々が提供しているアプリでもこの機能を利用してライブタイルの書き換えなどを行っているわけですが、この制限をご存じないユーザからの「タイルが更新されなくなった」というレビューは後を絶たず、どうにかならないものかと常々思っていたのですが、今のところこの辺りの仕様に変化は見られない様子。
仕方がないので、抜本的な対策ではありませんが、2週間の期限が近づいたらトースト通知する仕組みを仕込んでみました。
やることは単純で、アプリの起動日時を保存しておいて、エージェントタスクのOnInvokeメソッド内、NotifyComplete呼び出しの直前でトースト通知を出すだけです。
トースト通知をタップするとアプリが起動するので、その時点で起動日時がリセットされるという仕掛けです。
public MainPage() { InitializeComponent(); var settings = IsolatedStorageSettings.ApplicationSettings; //現在日時を保存 if (settings.Contains("LaunchDate")) settings.Remove("LaunchDate"); settings.Add("LaunchDate", DateTime.Now); }
protected override void OnInvoke(ScheduledTask task) { //TODO - any process var settings = IsolatedStorageSettings.ApplicationSettings; //最終起動日時から12日以上経過していたらトースト通知 if (((DateTime)settings["LaunchDate"]).AddDays(12) > DateTime.Now) { var toast = new ShellToast(); toast.Title = "App1"; toast.Content = "bkgd task deadline is close."; toast.Show(); } NotifyComplete(); }
トースト通知で表示できる文字数が少ないうえに、少し経つと消えてしまうのが難点ですが、通知に気づいてくれさえすればタップしてくれるかと…
この仕掛け、「Alarm +」には当初から実装済みなのですが、今回別件のためにバージョンアップして現在申請中の「Live Calendar」と「Live Calendar +」にも組み込んでみました。
久しぶりにいじったので余計なバグを仕込んでいなければ良いのですがw
コメントを残す