こんにちはHabr! Ankit Sinhalの記事「 Androidでタスクとジョブをインテリジェントにスケジュールする 」の無料翻訳に注目します。
現代のアプリケーション開発では、タスクは非同期で実行されることが非常に多く、その範囲はアプリケーションのライフサイクルを超えています。 状況によっては、いくつかの作業も行う必要がありますが、今すぐに行う必要はありません。 バックグラウンド作業をスケジュールするために、Androidはアプリケーションで正しく使用できるいくつかのAPIを導入しました。
適切なスケジューラを選択すると、アプリケーションのパフォーマンスとデバイスのバッテリ寿命を改善できます。
Androidでタスクをスケジュールするために使用できるAPIはいくつかあります。
- アラームマネージャー
- ジョブスケジューラ
- GCMネットワークマネージャー
- Firebase Job Dispatcher
- 同期アダプター
サービスの問題
サービスを使用すると、バックグラウンドで長時間の操作を実行できます。 バックグラウンドでサービスを実行すると、バッテリーの寿命に非常に悪影響を及ぼす。
サービスは、有用なタスクを実行しなくても、デバイスのリソースを常に使用する場合に特に有害です。
アプリケーションのライフサイクル中にスケジュールされたタスク
アプリケーションが起動され、特定の時間にタスクをスケジュールまたは実行したい場合、HandlerクラスとTimerおよびThreadを使用することをお勧めします。
アプリケーションがオフになっているときのスケジュールされたタスク
アラームマネージャー
AlarmManagerは、通知サービスへのアクセスを提供します。 これにより、アプリケーションのライフサイクル以外の操作を実行できます。 これにより、アプリケーションが実行されていない場合でも、イベントまたはアクションをトリガーできます。 AlarmManagerは、将来サービスを開始する可能性があります。
AlarmManager APIは、特定の時間に実行する必要があるタスクにのみ使用する必要があります。
使用例 :1時間または1時間ごとにタスクを完了するとします。 この場合、AlarmManagerが役立ちます。
ジョブスケジューラ
これは、前述のすべての計画オプションのメインであり、バックグラウンド作業で非常に効果的です。 Android 5.0(APIレベル21)で導入されたJobScheduler API 。
このAPIを使用すると、デバイスに利用可能なリソースがさらにある場合、または正しい条件に従っている場合にタスクを実行できます。 すべての条件は、タスクの作成時に定義できます。 宣言された基準が満たされると、システムはアプリケーションのJobServiceでこのタスクを完了します。 JobSchedulerは、必要に応じて、 DozeおよびApp Standbyの制限に従うために実行をキャンセルします。
GCMネットワークマネージャー
GCM(Google Cloud Messaging)Network Managerには、JobSchedulerのすべてのスケジュール機能があります。 GCM Network Managerは、バッテリー寿命を維持しながら、複数回または1回限りの避けられない作業を実行するようにも設計されています。
下位互換性をサポートするために使用され、Android 5.0(APIレベル21)でも使用できます。 APIレベル23以上から、GCM Network ManagerはプラットフォームにJobSchedulerを使用します。 GCM Network ManagerはGoogle Playサービスのスケジューリングメカニズムを使用するため、このクラスは、Google Playサービスがデバイスにインストールされている場合にのみ機能します。
Googleは、GCMユーザーがFCMに切り替え、代わりにFirebase Task Managerを使用してタスクをスケジュールすることを強く推奨しました。
Firebase Job Dispatcher
Firebase JobDispatcherは、バックグラウンドジョブをスケジュールするためのライブラリでもあります。 また、後方互換性をサポートするために使用され(API 21より下)、Androidのすべての最新バージョン(API 9+)で動作します。
このライブラリは、デバイスにGoogle Play開発者サービスがインストールされていない場合にも機能します。 この状態では、このライブラリは内部的にAlarmManagerを使用します。 Google Playアプリがデバイスで使用可能な場合、Google Playサービスのスケジューリングメカニズムを使用します。
同期アダプター
同期アダプターは、デバイスとクラウドの間でデータを同期するように特別に設計されています。 このタイプのタスクにのみ使用してください。 同期は、クラウドまたはデバイス上のデータの変更、または経過時間によって発生する可能性があります。
システムは、デバイスがネットワークに接続されている場合にのみ同期を試みます。
運動
十分な理論について説明したので、Androidタスクスケジューラの使用方法を見てみましょう。
ジョブサービスの作成
JobSchedulerServiceを作成するとJobServiceが拡張され 、 onStartJob (パラメーターJobParameters )とonStopJob (パラメーターJobParameters )の2つのメソッドを作成する必要があります。
public class JobSchedulerService extends JobService { @Override public boolean onStartJob(JobParameters params) { return false; } @Override public boolean onStopJob(JobParameters params) { return false; } }
onStartJobメソッドは 、 JobSchedulerが作業の開始を決定したときに呼び出されます。 JobServiceはメインスレッドで実行されるため、ロジックは個別のスレッドで実行する必要があります。 onStopJobメソッドは 、システムが作業の停止を決定すると呼び出されます。 このメソッドは、jobFinished(JobParameters、boolean)の前に呼び出されます。
また、AndroidManifestにサービスを登録する必要があります。
<application> <service android:name=”.JobSchedulerService “ android:permission=”android.permission.BIND_JOB_SERVICE” android:exported=”true”/> </application>
JobInfoオブジェクトを作成する
JobInfoオブジェクトを構築するには、以下に示すようにJobServiceをJobInfo.Builder()に渡します。 このジョブデザイナーを使用すると、ジョブの完了時にさまざまな制御パラメーターを設定できます。
ComponentName serviceName = new ComponentName(context, JobSchedulerService.class); JobInfo jobInfo = new JobInfo.Builder(JOB_ID, serviceName) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) .setRequiresDeviceIdle(true) .setRequiresCharging(true) .build();
スケジュールされたタスク
JobInfoとJobServiceができたので、作業を計画します。 次のように、必要なJobInfoで作業をスケジュールするだけです。
JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); int result = scheduler.schedule(jobInfo); if (result == JobScheduler.RESULT_SUCCESS) { Log.d(TAG, “Job scheduled successfully!”); }
おわりに
タスクを計画するときは、いつ、何がタスクを引き起こすのか、そして何らかの理由で失敗した場合に何をすべきかを慎重に検討する必要があります。 アプリケーションのパフォーマンスだけでなく、バッテリー電力などの他の側面にも非常に注意する必要があります。
JobSchedulerは実装が簡単で、ほとんどの場合に対応します。 JobSchedulerを使用すると、システムが再起動してもスケジュールされたジョブが保存されます。 現時点では、 JobSchedulerの唯一の欠点は、レベル21 api(Android 5.0)でのみ使用できることです。