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

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

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

代わりに通知を表示する

ほぼすべてのケースで、バックグラウンドのアプリでは、アクティビティを直接開始するのではなく、時間的制約のある通知を表示して、ユーザーに緊急情報を提供する必要があります。このような通知には、電話の着信やアクティブな目覚ましの処理などがあります。

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

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

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

Android 10 以降で実行されるアプリは、次の条件の 1 つ以上が満たされるとアクティビティを起動できます。

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

  • アプリに、ごく最近開始されたアクティビティがある。

  • アプリが、ごく最近、アクティビティに対して finish() を呼び出した。これは、finish() が呼び出された時点で、アプリがフォアグラウンドにアクティビティを持っていたか、フォアグラウンド タスクのバックスタックにアクティビティを持っていた場合にのみ該当します。

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

  • アプリに、別の表示可能なアプリによってバインドされているサービスがある。サービスにバインドされているアプリは、アクティビティを正常に開始するために、バックグラウンドでアプリから参照可能な状態を維持する必要があります。

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

  • アプリは、表示される別のアプリから送信される PendingIntent を受信します。

  • アプリは、アプリが UI を起動することが想定されるシステム ブロードキャストを受信します。たとえば、ACTION_NEW_OUTGOING_CALLSECRET_CODE_ACTION などです。ブロードキャストの送信後、数秒間はアクティビティを開始できます。

  • アプリが CompanionDeviceManager API を介してコンパニオン ハードウェア デバイスに関連付けられている。この API を使用すると、ペア設定済みのデバイスでユーザーが行った操作に応じて、アプリからアクティビティを開始できます。

  • アプリが、デバイス所有者モードで動作するデバイス ポリシー コントローラである。ユースケースの例としては、フルマネージド エンタープライズ デバイスや、デジタル サイネージやキオスクなどの専用デバイスがあります。

  • ユーザーによってアプリに SYSTEM_ALERT_WINDOW 権限が付与されている。

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

リストに記載されている条件に基づいて誤ってアクティビティを開始できないようにするため、Android 14 以降では、アクティビティの開始に対するアプリの権限の付与をオプトインまたはオプトアウトできる明示的な API が用意されています。

参照:

  • ActivityOptions.setPendingIntentBackgroundActivityStartMode
  • ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode

PendingIntent の送信元

Android 14 以降をターゲットとするアプリで PendingIntent を開始する場合は、

  • リストされている条項を満たし、かつ
  • これらの例外に基づいてバックグラウンド アクティビティの起動を許可する

このオプトインは、アプリがアクティビティを開始することをアプリ デベロッパーが認識している場合にのみ行う必要があります。

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

PendingIntent の作成者

Android 15 以降をターゲットとするアプリで PendingIntent を作成する場合、

  • リストされている条項を満たし、かつ
  • これらの例外に基づいてバックグラウンド アクティビティの起動を許可する

ほとんどの場合、オプトインするのは PendingIntent を開始したアプリになります。

PendingIntent を作成するアプリがオプトインすると、次のようになります。

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

そのため、そのような PendingIntent を信頼できないアプリに渡さず、不要になった PendingIntent をキャンセルすることをおすすめします。

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