web-dev-qa-db-ja.com

IntentService + startForegroundとJobIntentService

Android Oreoバックグラウンド実行制限)なので、ドキュメントではIntentServicesを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つは、すぐに開始されないことです。

8
Florian Walther

フォアグラウンドサービスはDozeの影響を受けませんが、画面がオフのときにタスクを続行する必要がある場合は、ウェイクロックを使用する必要があります。

JobIntentService(JobSchedulerを使用)はウェイクロックを管理しますが、ジョブをいつ開始するかは制御できません。

私はフォアグラウンドのIntentService(またはサービス)を優先度の高いタスク(データベースのダウンロードなど)に使用しますが、それらはすぐに実行され、システムによって一時停止/強制終了されるべきではありません。

JobIntentServiceをAlarmManagerと組み合わせて使用​​して、ウィジェットのデータを定期的に更新するなど、優先度の低いタスクをスケジュールします。

5
Derek K

長時間実行する操作をミュージックプレーヤーなどにしたい場合は、フォアグラウンドサービスを使用して通知します。 JobIntentServiceにはJobSchedulerのような時間実行制限があるためです。 ( 10分)

ユーザーがあなたの仕事について知る必要がないと思われる場合は、通知なしでJobIntentServiceを使用できます。

ユーザーがアプリをアクティブに使用している場合、Dozeモードについて心配する必要はありません。

https://www.bignerdranch.com/blog/diving-into-doze-mode-for-developers/ によると、Dozeモードにはいくつかのケースがあります。

画面がオフになりデバイスが充電されなくなった直後にLight-Dozeが作動し始め、数分待ってからユーザーがスマートフォンの使用を停止したことを確認するために制限が適用されます

たとえば、ユーザーが何かを計算しているときに画面をオフにしました。タスクが完了し、バックグラウンドサービスを実行したいと考えています。その場合、デバイスがDozeモードになる可能性があるため、JobIntentServiceを延期できます。

ただし、バックグラウンド操作をすぐに実行する場合は、画面がオフのときにForegroundServiceが機能しないため、WakeLockでForegrounServiceを使用します。

2
Valgaal