web-dev-qa-db-ja.com

IntentService + WakefulBroadcastReceiver + AlarmManagerは、API 26(Android 8.0 Oreo)で非推奨になりました。どちらが最良の選択肢ですか?

私のアプリでは、バックグラウンドで何かを繰り返し(X時間ごとに)行う必要がある場合があります。

私が使用するAPI25まで:

  • AlarmManager with setInexactRepeating(バッテリーを尊重するため)
  • WakefulBroadcastReceiverすべての作業を行うのに十分な時間がある
  • IntentServiceすべてをバックグラウンドスレッドで実行する

API 26では、これらすべてが非推奨または制限されており、代わりにJobSchedulerJobServiceとともに使用することをお勧めします。

問題は、JobServiceがメインスレッドで実行されることです。

AsyncTask内でJobServiceを使用し、onPostExecute内でJobService.jobFinishedを呼び出すと思います

これはこれを行う正しい方法ですか?

8
Xan

IntentServiceの正確なワークフローを持つサポートライブラリ26のJobIntentServiceを使用できます。 Oreo以前のデバイスの場合、JobIntentServiceは古いIntentServiceを使用します。 JobIntentServiceクラスは、AndroidのJobSchedulerAPIに依存しています。

詳細については、 https://developer.Android.com/reference/Android/support/v4/app/JobIntentService.html

6
Athul Antony

API 26では、これらすべてが非推奨または制限されています

AlarmManagerはAndroid 8.0、IIRCで変更されませんでした。IntentServiceはAndroid 8.0でも変更されませんでした。ただし、 IntentServiceをフォアグラウンドサービスにし、getForegroundService()PendingIntentを使用する必要があります。

問題は、JobIntentServiceがメインスレッドで実行されることです。

onHandleWork()は、Android 8.0+および8.0より前のデバイスの両方でバックグラウンドスレッドで呼び出されます。私は 私のこのサンプルアプリ を使用しました。 enqueueWork()(メインアプリケーションスレッドで呼び出されます)およびonHandleWork()内の現在のスレッドIDをログに記録するloggingステートメント。これらは異なるスレッドIDであるため、異なるスレッドです。

これはこれを行う正しい方法ですか?

いいえ、onHandleWork()で作業を行ってください。

4
CommonsWare