バックグラウンドからのアクティビティの起動に関する制限

Android 10(API レベル 29)以降では、アプリがバックグラウンドで実行されているときにアプリがアクティビティを開始できるタイミングが制限されています。これらの制限により、ユーザーに対する割り込みを最小限に抑え、ユーザーは画面内の表示内容を詳細に制御できるようになります。

このガイドでは、バックグラウンドからアクティビティを起動する方法の代替として通知について説明します。また、制限が適用されない具体的なケースも示します。

代わりに通知を表示する

通常の場合、バックグラウンドにあるアプリは、直接アクティビティを起動するのではなく、タイミングが重要な通知を表示して緊急情報をユーザーに提供する必要があります。このような通知には、着信した通話やアクティブなアラーム クロックの処理が含まれます。

この通知ベースのアラート / リマインダー システムは、ユーザーにとってさまざまなメリットがあります。

  • デバイスを使用している最中でも、ヘッドアップ通知が表示されるため、返信することができます。ユーザーは現在のコンテキストを維持しつつ、画面に表示されるコンテンツを制御できます。
  • 時間に敏感な通知には、ユーザーの [サイレント モード] ルールが適用されます。たとえば、[サイレント モード] が有効になっている場合、ユーザーは、特定の連絡先からの通話や同一発信者による再発信だけを許可することができます。
  • デバイスの画面がオフになると、すぐに全画面表示インテントが起動されます。
  • デバイスの [設定] 画面で、最近通知を送信したアプリや使用された通知チャネルを確認できます。この画面から、ユーザーは自分の通知設定を制御できます。

アプリがアクティビティを開始できるタイミング

Android 10 以降を搭載したデバイスで実行されるアプリは、以下の 1 つ以上の条件が満たされた場合にアクティビティを開始できます。

  • フォアグラウンドにあるアクティビティなど、アプリが可視ウィンドウを持っている場合。
  • フォアグラウンド タスクのバックスタック内に、アプリのアクティビティがある場合。
  • アプリのアクティビティが [最近] 画面の既存タスクのバックスタックにある場合。

  • アプリが、ごく最近起動されたアクティビティを持っている場合。

  • アプリがごく最近アクティビティの finish() を呼び出した場合。この条件が適用されるのは、finish() の呼び出し時に、アプリがフォアグラウンド内にアクティビティを持っていた場合か、フォアグラウンド タスクのバックスタック内にアクティビティを持っていた場合に限られます。

  • アプリに、システムによってバインドされている次のいずれかのサービスがある。これらのサービスは UI を起動する必要がある場合があります。

  • アプリが、別の可視アプリによってバインドされているサービスを持っている場合。アクティビティを正常に開始するには、サービスにバインドされているアプリが、バックグラウンド内で対象アプリに対して可視状態を維持している必要があります。

  • アプリが PendingIntent 通知をシステムから受信した場合。サービスやブロードキャスト レシーバを対象とするペンディング インテントの場合、アプリは、ペンディング インテントが送信された後、数秒間アクティビティを起動できます。

  • アプリが、別の可視アプリから送信された PendingIntent を受信した場合。

  • アプリが UI を起動するシステム ブロードキャストを受け取る。ACTION_NEW_OUTGOING_CALLSECRET_CODE_ACTION などがあります。アプリはブロードキャストが送信された後、数秒間アクティビティを起動できます。

  • アプリが CompanionDeviceManager API 経由でコンパニオン ハードウェア デバイスに関連付けられている場合。この API により、アプリはペア設定されたデバイス上でユーザーが実行するアクションに応じてアクティビティを起動できます。

  • アプリが、デバイス オーナー モードで稼働しているDevice Policy Controller である場合。ユースケースの例としては、完全管理型エンタープライズ デバイスや、デジタル サイネージ、キオスクなどの専用デバイスがあります。

  • ユーザーがアプリに SYSTEM_ALERT_WINDOW 権限を付与している場合。

PendingIntent からアクティビティを開始する際にオプトインが必要

上記の条件に基づいてアクティビティが誤って起動されないようにするため、Android 14 以降では、アクティビティの起動に関するアプリの権限を許可または拒否できる明示的な API が用意されています。

Android 15 以降をターゲットとするアプリでは、デフォルトで、作成した PendingIntents にバックグラウンド アクティビティの起動(BAL)権限が暗黙的に付与されなくなります。明示的なオプトインが必要です。そのためには、アプリが PendingIntents を送信する場合と作成する場合に応じて、次のオプションがあります。

保留中のインテント テーブル
図 1: バックグラウンド アクティビティの起動に関する意思決定フロー。

PendingIntent の送信者によって

Android 14 以降をターゲットとし、PendingIntent を開始するアプリは、次の要件を満たす必要があります。

  • 記載されている条件を満たし、
  • これらの例外に基づいてバックグラウンド アクティビティの開始を許可するようオプトインする

このオプトインは、アプリがアクティビティを開始することをアプリ デベロッパーが認識している場合にのみ行ってください。

オプトインするには、アプリで setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) を含む ActivityOptions バンドルを PendingIntent.send() メソッドまたは同様のメソッドに渡す必要があります。

PendingIntent の作成者によって

Android 15 以降をターゲットとするアプリで PendingIntent を作成する場合は、記載されている条件PendingIntents を起動できるように、バックグラウンド アクティビティの起動を許可するように明示的にオプトインする必要があります。

ほとんどの場合、PendingIntent を開始するアプリがオプトインする必要があります。ただし、作成元のアプリがこれらの権限を付与する必要がある場合は、

  • PendingIntent は、作成中のアプリが表示されているときにいつでも開始できます。
  • 作成元のアプリに特別な権限がある場合、PendingIntent はいつでも開始できます。

オプトインするには、アプリで setPendingIntentCreatorBackgroundActivityStartMode (ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) を含む ActivityOptions バンドルを PendingIntent.getActivity() メソッドまたは同様のメソッドに渡す必要があります。

詳細については、関連するリファレンス ドキュメントをご覧ください。