Android 12 デベロッパー プレビューへようこそ。早い段階から頻繁にフィードバックをお送りいただき、Android 12 をさらに優れたリリースにするためにご協力ください。

フォアグラウンド サービスの起動に関する制限

「フィードバック送信」アイコン この制限事項について、フィードバックをお寄せください。簡単なアンケートにご協力いただき、ご意見をお聞かせください。特に、この変更がアプリに影響するユースケースをお知らせください。

Android 12 をターゲットとするアプリは、バックグラウンドで動作しているとき、少数の特殊なケースを除いて、フォアグラウンド サービスを起動できなくなりました。アプリがバックグラウンドで動作しているときにフォアグラウンド サービスを起動しようとすると、そのフォアグラウンド サービスが例外ケースのいずれかに該当しない限り、システムは IllegalStateException をスローします。

アプリがこの変更の影響を受ける場合は、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() を使用することをおすすめします。

バックグラウンドからフォアグラウンド サービスを起動することが許可されるケース

以下の状況では、アプリがバックグラウンドで動作しているときでも、フォアグラウンド サービスを起動できます。

このダイアログは、ユーザーがアプリを常にバックグラウンドで実行したいかどうかを尋ねています。ダイアログには、[許可しない] と [許可] の 2 つのボタンがあります。
図 1. 電池の最適化をオフにするとデバイスの電池消費量が増加する場合があることをユーザーに警告するシステム ダイアログ