JobScheduler は、API 21(Android 5.0 Lollipop)で導入されたAndroidのシステムサービスで、アプリが指定された条件に基づいてバックグラウンドタスクの実行をスケジュールできるようにします。AlarmManagerとは異なり、JobSchedulerは正確な実行時間を必要としません。システム自体が、アプリの要件とデバイスの現在の状態を組み合わせて最適なタイミングを決定します。Android Developers, 2026によると、このサービスはネットワーク、充電、ストレージ状態、デバイスのアイドル状態に関する条件をサポートしています。
重要ポイント
JobScheduler は、消費電力を削減するために複数のバックグラウンドタスクをバッチにグループ化するAndroidのシステムサービスです。各アプリがデバイスを起動して独自のタスクを実行する代わりに、JobSchedulerがそれらをグループ化し、デバイスがすでにアクティブな最適なタイミングで実行します。これにより、バッテリー寿命が大幅に延長されます。
JobScheduler以前は、開発者はバックグラウンドタスクに AlarmManager と BroadcastReceiver を使用していました。このアプローチの問題点は、各アプリが個別にデバイスを起動するため、バッテリーが急速に消耗することでした。JobSchedulerは、バッチ実行ウィンドウを導入することでこの問題を解決しました。このウィンドウ内で、システムはさまざまなアプリのスケジュールされたすべてのタスクを同時に起動します。
動作原理 は、アプリがJobSchedulerに渡すJobInfoオブジェクトに基づいています。システムはタスクを保存し、指定されたすべての条件が満たされたときに実行します。WorkManagerとは異なり、JobSchedulerは障害時の再起動を保証しません。タスクが例外をスローした場合、開発者は手動で再スケジュールする必要があります。
JobScheduler は、JobServiceとJobInfoに基づくアーキテクチャを使用します。JobInfoはタスクとその条件を記述し、JobServiceには実行ロジックが含まれます。アプリはgetSystemService(JobScheduler.class)を介してタスクを登録し、schedule(jobInfo)を呼び出します。システムがスケジューリングを担当します。
JobService はServiceを拡張する抽象クラスです。onStartJob(タスク開始時に呼び出される)とonStopJob(システムがタスクを強制停止するときに呼び出される)の2つの主要なメソッドがあります。JobInfoはBuilderを介して作成され、識別子、条件、時間制約など、すべてのタスクパラメーターが含まれます。
public class SyncJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// メインスレッドで実行
Thread thread = new Thread(() -> {
performSync();
jobFinished(params, false);
});
thread.start();
return true; // true = 作業継続
}
@Override
public boolean onStopJob(JobParameters params) {
return true; // true = タスクを再スケジュール
}
}
JobScheduler では、ネットワークタイプ(NETWORK_TYPE_ANY、NOT_ROAMING、UNMETERED)、充電状態(requiresCharging)、バッテリーレベル(requiresBatteryNotLow)、ストレージ状態(requiresStorageNotLow)、アイドルモード(requiresDeviceIdle)など、複数の条件を同時に設定できます。タスクはすべての条件が満たされた場合にのみ実行されます。
JobInfo.Builder は、各バックグラウンドタスクに柔軟な設定を提供します。パラメーターを適切に組み合わせることで、実行の適時性と消費電力のバランスを取ることができます。
| メソッド | 説明 | 例 |
|---|---|---|
| setRequiredNetworkType | 必要なネットワークタイプ | NETWORK_TYPE_UNMETERED |
| setRequiresCharging | デバイス充電中 | true |
| setRequiresDeviceIdle | デバイスアイドル中 | true |
| setOverrideDeadline | 最大待機時間(ms) | 300000 |
| setMinimumLatency | 最小遅延(ms) | 60000 |
| setPeriodic | 定期実行(ms) | 3600000 |
| setBackoffCriteria | 障害時の再試行戦略 | LINEAR / EXPONENTIAL |
重要なパラメーターは setOverrideDeadline です。期限を指定すると、すべての条件が満たされていない場合でも、システムはその時間までにタスクを実行することを保証します。これは、6時間ごとの同期など、時間に重要なタスクに役立ちます。
典型的なシナリオ は、Wi-Fiに接続してデバイスを充電しているときのデータ同期です。アプリは対応する条件でJobInfoを作成し、JobSchedulerに渡します。システムは好条件が揃ったときにタスクを実行します。
ComponentName serviceName = new ComponentName(this, SyncJobService.class);
JobInfo jobInfo = new JobInfo.Builder(JOB_ID_SYNC, serviceName)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.setOverrideDeadline(6 * 60 * 60 * 1000) // 6時間
.build();
JobScheduler scheduler = (JobScheduler)
getSystemService(Context.JOB_SCHEDULER_SERVICE);
scheduler.schedule(jobInfo);
JobServiceは AndroidManifest.xml にBIND_JOB_SERVICE権限で登録する必要があります。onStartJobメソッドでは、作業完了後にjobFinishedを呼び出すことが重要です。そうしないと、システムはタスクが無期限に実行されていると見なし、強制停止する可能性があります。
<service
android:name=".SyncJobService"
android:permission="android.permission.BIND_JOB_SERVICE" />
JobScheduler にはいくつかの制限があります。第一に、Android 5+でのみ利用可能です。古いバージョンでは代替手段が必要です。第二に、特にAndroid 9+のApp Standby Bucketsでは、システムは使用頻度の低いアプリのタスクを遅延させる可能性があります。第三に、JobSchedulerは障害時の再起動を保証するメカニズムを提供しません。
Googleは、JobSchedulerを直接使用する代わりに WorkManager を使用することを推奨しています。WorkManagerはAndroid 5+で内部的にJobSchedulerを使用しますが、古いバージョンのサポート、実行保証、タスクチェーン、LiveDataを介した状態監視を追加します。アプリがAndroid 8+のみをサポートし、複雑なバックグラウンドタスクロジックを必要としない場合、JobSchedulerは依然として正当な選択肢です。
JobSchedulerをデバッグするには、ADB経由で dumpsys jobscheduler を使用します。このコマンドは、スケジュールされたすべてのタスク、そのステータス、残り時間、実行履歴を表示します。特定のアプリの場合は次のようにします: adb shell dumpsys jobscheduler | grep package_name。これにより、タスクが登録されているか、どの条件が設定されているか、実行されない理由を確認できます。プログラムでタスクステータスを確認するには、JobScheduler.getPendingJob()を使用することもできます。さらに、Android Studio Profilerを使用して、タスク実行中の消費電力を分析できます。Android 5+のアプリの場合、JobSchedulerはネットワークと充電の条件を伴う不正確なバックグラウンドタスクに対して信頼性の高いツールであり続けています。
デフォルトでは、JobService はメインスレッドで実行されるため、すべてのブロッキング操作には別のスレッドを作成するか、AsyncTaskを使用する必要があります。WorkManagerとは異なり、JobSchedulerには組み込みのスレッドプールがありません。開発者はスレッドと同期を独立して管理します。並列タスクにはThreadPoolExecutor、メインスレッドとの通信にはHandlerを使用することをお勧めします。onStopJobでは、リークを防ぐために実行中のスレッドを適切に中断することが重要です。
JobSchedulerは setPeriodic(long intervalMillis) メソッドを介して定期タスクをサポートしています。最小間隔は15分です。ただし、WorkManagerとは異なり、JobSchedulerは正確な間隔の順守を保証しません。システムは他のタスクとバッチ処理するために実行をずらす可能性があります。setPeriodicメソッドは、後のAPIバージョンで登場したフレックス間隔(フレキシブルウィンドウ)もサポートしていません。正確な定期実行には、BroadcastReceiverと組み合わせてAlarmManagerを使用してください。
Android 9以降、Googleは App Standby Buckets を導入しました。これは、使用頻度に応じてアプリをActive、Working Set、Frequent、Rareに分類します。Rareカテゴリのアプリでは、JobSchedulerタスクの実行が最大24時間遅延します。開発者はアプリの品質を通じてのみカテゴリに影響を与えることができます。システムメカニズムは、ユーザーが定期的に操作するアプリの優先度を自動的に上げます。JobSchedulerはこの分類を考慮し、Rareアプリのタスクはメンテナンスウィンドウでのみ実行されます。Activeカテゴリ(最も頻繁に使用される)のアプリの場合、遅延は最小限で、条件が満たされるとタスクはほぼ即座に実行されます。
正確な時間での定期タスクには、JobSchedulerは適していません。AlarmManager を使用してください。短時間の単発タスクには、通知付きのForeground Serviceを使用します。JobSchedulerは、時間精度よりもエネルギー効率が重要なタスク(同期、アップデートのダウンロード、バッチデータ処理)に最適です。バックグラウンド作業ツールの適切な選択は、ユーザーエクスペリエンスとデバイスのバッテリー寿命に直接影響します。最終的な結論: 条件付きバッチ処理にはJobScheduler、スケジュールタスクにはAlarmManager、汎用スケジューラーとしてWorkManagerを使用してください。
よくある質問
はい、JobScheduler は異なるアプリのタスクをバッチにグループ化し、一緒に実行します。これはAlarmManagerに対する重要な利点です。各アプリが個別にデバイスを起動する代わりに、システムが一度プロセッサを起動し、スケジュールされたすべてのタスクを処理します。
合理的な時間内に jobFinished が呼び出されない場合、システムは強制的にonStopJobを呼び出してタスクを終了する可能性があります。1つのタスクは数分以内に完了し、完了時に必ずjobFinishedを呼び出すことをお勧めします。
Doze Mode では、JobSchedulerは次のメンテナンスウィンドウ(定期的に発生)まですべてのタスクを延期します。setOverrideDeadlineを使用すると、これらのウィンドウを考慮してタスクが実行されることが保証されますが、正確な時間に実行されるとは限りません。
WorkManager は、Android 5+で内部的にJobSchedulerを使用するライブラリです。WorkManagerは、実行保証、古いバージョン(API 14+)のサポート、Workerチェーン、LiveData/Flowによる状態監視、障害時の自動再試行を追加します。
キャンセルするには、特定のタスクには scheduler.cancel(JOB_ID)、アプリのすべてのタスクには scheduler.cancelAll() を使用します。Job IDがJobInfo作成時に指定したものと一致していることを確認してください。一致しない場合、タスクはキャンセルされません。
開発者は、JobSchedulerがデバイス上のバックグラウンドタスクを完全に制御したい経験豊富なチーム向けに設計された低レベルのシステムAPIであることを理解する必要があります。ほとんどのアプリケーションでは、WorkManagerがAndroid向けのよりシンプルで安全かつ最新のAPIで同じ機能を提供します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。