Android 12 をターゲットとするアプリは、バックグラウンドで動作しているとき、少数の特殊なケースを除いて、フォアグラウンド サービスを起動できなくなりました。アプリがバックグラウンドで動作しているときにフォアグラウンド サービスを起動しようとすると、そのフォアグラウンド サービスが例外ケースのいずれかに該当しない限り、システムは IllegalStateException
をスローします。
推奨されるフォアグラウンド サービスの代替策: WorkManager
アプリがこの変更の影響を受ける場合は、WorkManager を使用する方法に移行することをおすすめします。Android 12 ベータ版がリリースされると、WorkManager は優先度の高いバックグラウンド タスクを開始するための推奨ソリューションになります。
WorkManager 2.7.0-alpha01 では、Android 12 の新しいタイプのジョブである優先ジョブがサポートされます。Android 11 以下では、このバージョンの WorkManager は、フォアグラウンド サービスを使用して下位互換性を提供します。
Work Manager 2.7.0-alpha01 が優先ジョブを使用する方法の詳細な例については、GitHub の WorkManagerSample を参照してください。
優先ジョブ
Android 12 の新機能である優先ジョブを使用すると、アプリが重要なタスクを実行している間、システムはリソースへのアクセスをより適切に制御できます。優先ジョブは、フォアグラウンド サービスと JobScheduler
ジョブの中間的な性質を持っています。
- 優先ジョブは、バッテリー セーバーや Doze を含む、システムの電源管理に関する制限の一部による影響を受けません。
- システムの現在のワークロードが許容すれば、優先ジョブはすぐに実行されます。
優先ジョブは遅延する可能性がある
システムは、指定された優先ジョブが呼び出されると、できる限り速やかに実行しようと試みます。ただし、他のタイプのジョブと同様に、すでに実行されているジョブが多すぎる場合やシステム リソースが少なくなっている場合は、システムによって新しい優先ジョブの開始が遅延されることがあります。
特に、次の条件の少なくとも 1 つに該当する場合、システムは優先ジョブの実行を遅らせます。
- システム負荷が高すぎる。
- 優先ジョブの割り当て上限を超えている。優先ジョブでは、アプリ スタンバイ バケットに基づく割り当てシステムにより、ローリング時間枠内の最大実行時間が制限されます。優先ジョブに使用される割り当ては、他のタイプのバックグラウンド ジョブに使用される割り当てよりも厳格に制限されます。
WorkManager のアップデート
WorkManager 2.7.0-alpha01 以降では、アプリは setExpedited()
を呼び出して、Worker
を優先させる旨宣言できます。この新しい API は、Android 12 で実行されたときは優先ジョブを使用し、以前のバージョンの Android ではフォアグラウンド サービスを使用します。
デベロッパーがアプリで優先処理をリクエストするタイミングを意識するように促すため、また、タスクを実行できる期間を延長する機能のサポートを強化するため、CoroutineWorker.setForeground()
メソッドと ListenableWorker.setForegroundAsync()
メソッドはサポートが終了しました。特に、Android 12 を搭載したデバイスでは、ListenableWorker.setForegroundAsync()
を呼び出そうとすると IllegalStateException
がスローされます。代わりに setExpedited()
を使用することをおすすめします。
バックグラウンドからフォアグラウンド サービスを起動することが許可されるケース
以下の状況では、アプリがバックグラウンドで動作しているときでも、フォアグラウンド サービスを起動できます。
- アプリがユーザーに表示された状態(アクティビティなど)から遷移する。
- アプリが Firebase Cloud Messaging を使用して優先度の高いメッセージを受信する。
- ユーザーがアプリに関連する UI 要素でアクションを実行する。たとえば、バブル、通知、ウィジェット、またはアクティビティを操作する。
- アプリがジオフェンスまたは操作の認識に関連するイベントを受信する。
- デバイスが再起動して、ブロードキャスト レシーバで
ACTION_BOOT_COMPLETED
インテント アクションを受信した後。 - アプリがデバイス所有者やプロファイル所有者など、特定のシステムロールまたは権限を持っている。
- アプリがコンパニオン デバイス マネージャーを使用している。
アプリが
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
権限をリクエストしてユーザーを設定ページに誘導し、ユーザーがアプリに対して電池の最適化を無効にした。システム設定の [電池の最適化] ページにユーザーを誘導するには、
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
インテント アクションを含むインテントを呼び出します。そのページでユーザーがアプリに対して電池の最適化をオフにすると、図 1 のダイアログが表示されます。バックグラウンドからのアクティビティの起動に関する制限の例外に記載されている条件のいずれかをアプリが満たしている。ただし、既存のタスクのバックスタックにアプリのアクティビティがある場合は除きます。