私のアプリでは、バックグラウンドで何かを繰り返し(X時間ごとに)行う必要がある場合があります。
私が使用するAPI25まで:
AlarmManager
with setInexactRepeating(バッテリーを尊重するため)WakefulBroadcastReceiver
すべての作業を行うのに十分な時間があるIntentService
すべてをバックグラウンドスレッドで実行するAPI 26では、これらすべてが非推奨または制限されており、代わりにJobScheduler
をJobService
とともに使用することをお勧めします。
問題は、JobService
がメインスレッドで実行されることです。
AsyncTask
内でJobService
を使用し、onPostExecute
内でJobService.jobFinished
を呼び出すと思います
これはこれを行う正しい方法ですか?
IntentServiceの正確なワークフローを持つサポートライブラリ26のJobIntentServiceを使用できます。 Oreo以前のデバイスの場合、JobIntentServiceは古いIntentServiceを使用します。 JobIntentServiceクラスは、AndroidのJobSchedulerAPIに依存しています。
詳細については、 https://developer.Android.com/reference/Android/support/v4/app/JobIntentService.html
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()
で作業を行ってください。