Android Oreoバックグラウンド実行制限)なので、ドキュメントではIntentService
sをJobIntentService
にリファクタリングすることを推奨しています。
https://developer.Android.com/about/versions/oreo/background
JobIntentService
はOreoの下でIntentService
としてすぐに実行されますが、Oreo +でジョブをスケジュールします
https://developer.Android.com/reference/Android/support/v4/app/JobIntentService
通常のIntentService
を永続的な通知でフォアグラウンドService
として実行するのはどのような場合に意味がありますか?JobIntentService
の方が良いのはいつですか?
JobIntentService
で見られる欠点の1つは、すぐに開始されないことです。
フォアグラウンドサービスはDozeの影響を受けませんが、画面がオフのときにタスクを続行する必要がある場合は、ウェイクロックを使用する必要があります。
JobIntentService(JobSchedulerを使用)はウェイクロックを管理しますが、ジョブをいつ開始するかは制御できません。
私はフォアグラウンドのIntentService(またはサービス)を優先度の高いタスク(データベースのダウンロードなど)に使用しますが、それらはすぐに実行され、システムによって一時停止/強制終了されるべきではありません。
JobIntentServiceをAlarmManagerと組み合わせて使用して、ウィジェットのデータを定期的に更新するなど、優先度の低いタスクをスケジュールします。
長時間実行する操作をミュージックプレーヤーなどにしたい場合は、フォアグラウンドサービスを使用して通知します。 JobIntentServiceにはJobSchedulerのような時間実行制限があるためです。 ( 10分)
ユーザーがあなたの仕事について知る必要がないと思われる場合は、通知なしでJobIntentServiceを使用できます。
ユーザーがアプリをアクティブに使用している場合、Dozeモードについて心配する必要はありません。
https://www.bignerdranch.com/blog/diving-into-doze-mode-for-developers/ によると、Dozeモードにはいくつかのケースがあります。
画面がオフになりデバイスが充電されなくなった直後にLight-Dozeが作動し始め、数分待ってからユーザーがスマートフォンの使用を停止したことを確認するために制限が適用されます
たとえば、ユーザーが何かを計算しているときに画面をオフにしました。タスクが完了し、バックグラウンドサービスを実行したいと考えています。その場合、デバイスがDozeモードになる可能性があるため、JobIntentServiceを延期できます。
ただし、バックグラウンド操作をすぐに実行する場合は、画面がオフのときにForegroundServiceが機能しないため、WakeLockでForegrounServiceを使用します。