Android 12(API レベル 31)以降をターゲットとするアプリは、少数の特殊なケースを除き、バックグラウンドで動作しているときにフォアグラウンド サービスを起動できません。アプリがバックグラウンドで実行されているときにフォアグラウンド サービスを開始しようとし、フォアグラウンド サービスが例外ケースのいずれにも該当しない場合、システムは ForegroundServiceStartNotAllowedException をスローします。
また、アプリが使用中の権限(ボディセンサー、カメラ、マイク、位置情報の権限など)を必要とするフォアグラウンド サービスを起動する場合、アプリがバックグラウンド起動制限の除外対象であっても、アプリがバックグラウンドにある間はサービスを作成できません。この理由については、使用中権限を必要とするフォアグラウンド サービスの開始に関する制限事項のセクションで説明しています。
バックグラウンドでの起動の制限の適用対象外
次のような状況では、アプリがバックグラウンドで実行されている場合でも、フォアグラウンド サービスを開始できます。
- アプリがユーザーに表示された状態(アクティビティなど)から遷移する。
- アプリがバックグラウンドからアクティビティを開始できる。ただし、既存のタスクのバックスタックにアプリのアクティビティがある場合は除きます。
アプリが Firebase Cloud Messaging を使用して優先度の高いメッセージを受信した。
ユーザーがアプリに関連する UI 要素でアクションを実行する。たとえば、バブル、通知、ウィジェット、またはアクティビティを操作する。
アプリが正確なアラームを呼び出して、ユーザーがリクエストしたアクションを完了する。
アプリがデバイスの現在の入力方法である。
アプリがジオフェンスまたはアクティビティ遷移の検出に関連するイベントを受信する。
デバイスが再起動して、ブロードキャスト レシーバで
ACTION_BOOT_COMPLETED、ACTION_LOCKED_BOOT_COMPLETED、またはACTION_MY_PACKAGE_REPLACEDのインテント アクションを受信した後。アプリがブロードキャスト レシーバで
ACTION_TIMEZONE_CHANGED、ACTION_TIME_CHANGED、またはACTION_LOCALE_CHANGEDのインテント アクションを受信する。アプリは
NfcServiceからACTION_TRANSACTION_DETECTEDイベントを受信します。アプリがコンパニオン デバイス マネージャーを使用し、
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND権限またはREQUEST_COMPANION_RUN_IN_BACKGROUND権限を宣言している。可能な限り、REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDを使用してください。ユーザーがアプリのバッテリーの最適化をオフにした。
アプリが
SYSTEM_ALERT_WINDOW権限を保持している。注: Android 15 以降をターゲットとするアプリの場合、SYSTEM_ALERT_WINDOW権限が必要であり、かつ、アプリに現在表示されているオーバーレイ ウィンドウが必要です。
使用中の権限が必要なフォアグラウンド サービスの起動に関する制限
Android 14(API レベル 34)以降では、使用中の権限が必要なフォアグラウンド サービスを開始する場合、注意が必要な特別な状況があります。
Android 14 以降をターゲットとするアプリの場合、フォアグラウンド サービスを作成すると、オペレーティング システムは、アプリにそのサービスタイプに適したすべての権限があることを確認します。たとえば、microphone タイプのフォアグラウンド サービスを作成すると、オペレーティング システムは、アプリに現在 RECORD_AUDIO 権限があることを確認します。この権限がない場合、システムは SecurityException をスローします。
使用中の権限の場合、これが潜在的な問題を引き起こします。アプリに「使用中」の権限がある場合、その権限はフォアグラウンドにある間のみ有効です。つまり、アプリがバックグラウンドにあり、カメラ、位置情報、マイクのタイプのフォアグラウンド サービスを作成しようとすると、システムはアプリに必要な権限が現在ないことを認識し、SecurityException をスローします。
同様に、アプリがバックグラウンドにあり、BODY_SENSORS 権限を必要とするヘルスサービスを作成する場合、アプリには現在その権限がないため、システムは例外をスローします。(これは、ACTIVITY_RECOGNITION など、異なる権限を必要とするヘルスサービスには適用されません)。PermissionChecker.checkSelfPermission() を呼び出しても、この問題は防げません。アプリに使用中の権限があり、checkSelfPermission() を呼び出してその権限があるかどうかを確認すると、アプリがバックグラウンドにある場合でも、このメソッドは PERMISSION_GRANTED を返します。このメソッドが PERMISSION_GRANTED を返す場合、アプリは使用中にこの権限を保持していることを示します。
そのため、フォアグラウンド サービスが使用中権限を必要とする場合は、サービスが定義済みの除外のいずれかに該当しない限り、アプリに表示されるアクティビティがある間に Context.startForegroundService() または Context.bindService() を呼び出す必要があります。
使用中の権限に関する制限の除外
状況によっては、アプリが バックグラウンドで実行されている間にフォアグラウンド サービスが開始された場合でも、アプリがフォアグラウンドで実行されている間(「使用中」)は、位置情報、カメラ、マイクの情報にアクセスできます。
同じ状況で、サービスが location のフォアグラウンド サービス タイプを宣言し、ACCESS_BACKGROUND_LOCATION 権限を持つアプリによって開始された場合、このサービスは、アプリがバックグラウンドで実行されているときでも、常に位置情報にアクセスできます。
次のリストに、これらの状況を示します。
- システム コンポーネントがサービスを開始する。
- サービスは、アプリ ウィジェットを操作することで開始されます。
- サービスは通知を操作することで開始されます。
- サービスは、別の表示可能なアプリから送信される
PendingIntentとして開始されます。 - サービスは、デバイス所有者モードで動作する デバイス ポリシー コントローラ であるアプリによって開始されます。
- サービスは、
VoiceInteractionServiceを提供するアプリによって開始されます。 - サービスは、
START_ACTIVITIES_FROM_BACKGROUND特権を持つアプリによって開始されます。
アプリで影響を受けるサービスを特定する
アプリをテストするとき、フォアグラウンド サービスを開始します。開始されたサービスが、位置情報、マイク、カメラに対するアクセスを制限されている場合は、次のメッセージが Logcat に表示されます。
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME