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
としてサービスが開始される。 - デバイス所有者モードで実行されている Device Policy Controller であるアプリによってサービスが開始される。
VoiceInteractionService
を提供するアプリによってサービスが開始される。START_ACTIVITIES_FROM_BACKGROUND
特権を持つアプリによってサービスが開始される。
アプリで影響を受けるサービスを特定する
アプリをテストするとき、フォアグラウンド サービスを開始します。開始されたサービスが、位置情報、マイク、カメラに対するアクセスを制限されている場合は、次のメッセージが Logcat に表示されます。
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME