none
UWPアプリケーションのバックグラウンドタスクが制限時間を超えたとき、もう一度同じタスクを起動したい RRS feed

  • 質問

  • お世話になります。

    バックグラウンドタスクとして常駐し続け、定期的にGPS位置情報を取得するようなUWPアプリケーションを作成したいと考えております。

    GPSの取得間隔はアプリの設定次第で数秒~数分程度にしたいと考えており、TimeTriggerでは対応できないため、ApplicationTriggerでバックグラウンドタスクを起動しており、バックグラウンドタスク側の実装としては、Runメソッド内で Geolocator.PositionChanged イベントへのイベントハンドラ紐づけ等を行った後、Runメソッド自体はそのまま(BackgroundTaskDeferral.Complete()を呼び出さずに)終了しております。

    Runメソッドが実行された後は、Geolocator.PositionChanged イベントが発生するたびにハンドラで位置情報を取得しているのですが、実際に動作させてみると、10分程度でバックグラウンドタスクが動かなくなります。

    これは、バックグラウンドタスクのウォールクロック時間の制限を超えたためと推測しているのですが、制限時間を超えたためにバックグラウンドタスクが終了した場合、また同じタスクを自動で起動しなおすにはどうしたら良いでしょうか。

    または、上述のような実装以外で、数秒~数分の頻度でバックグラウンドタスクを起動するような方法はございますでしょうか?

    ご教示のほどよろしくお願いいたします。

    2016年5月9日 6:35

回答

  • こんにちは。

    少し調べてみましたが、ApplicationTriggerでは難しそうだなぁと感じました。

    MaintenanceTriggerであればOneShotオプションがあるので繰り返しトリガーすることが出来るようですが、
    AC電源の接続が前提であり、今回はGPS位置情報を取得したいとのことなので不適切ですよね。

    試したことがなく、情報がなかなか見当たらないので、あまり根拠のない提案なのですが、
    バックグラウンドタスクではなく、以下の延長実行?(ExtendedExecutionSession)を調べてみてはどうでしょうか。

    アプリ ライフサイクル - バックグラウンド タスクと延長実行によるアプリ稼働状態の維持

    指定する延長理由に「LocationTracking」が存在することから、
    もしかしたら使えるかも、と思った次第です。


    2016年5月9日 7:36
    モデレータ

すべての返信

  • こんにちは。

    少し調べてみましたが、ApplicationTriggerでは難しそうだなぁと感じました。

    MaintenanceTriggerであればOneShotオプションがあるので繰り返しトリガーすることが出来るようですが、
    AC電源の接続が前提であり、今回はGPS位置情報を取得したいとのことなので不適切ですよね。

    試したことがなく、情報がなかなか見当たらないので、あまり根拠のない提案なのですが、
    バックグラウンドタスクではなく、以下の延長実行?(ExtendedExecutionSession)を調べてみてはどうでしょうか。

    アプリ ライフサイクル - バックグラウンド タスクと延長実行によるアプリ稼働状態の維持

    指定する延長理由に「LocationTracking」が存在することから、
    もしかしたら使えるかも、と思った次第です。


    2016年5月9日 7:36
    モデレータ
  • ご回答ありがとうございます。

    リンク先を読んでみました。確かに延長実行で私のやりたいことは実現できそうです。

    もう少し調べて、延長実行を試してみようと思います。

    2016年5月9日 7:58
  • 従来バックグラウンドタスクで行っていた処理を延長実行で行うようにしたところ、10分でも20分でも実行し続けられ、画面が閉じられている時も処理が実行されていることが確認できました。

    他のアプリ等によりリソースが圧迫されて延長実行が失効した場合については、また別の対策を考えようと思います。

    大変助かりました。ありがとうございます。

    2016年5月10日 7:20