Android 10(API レベル 29)以降では、アプリがバックグラウンドで実行されているときに、アクティビティを開始できるタイミングが制限されています。こうした制限により、ユーザーへの中断を最小限に抑え、ユーザーは画面の表示内容をより詳細に制御できます。
このガイドでは、バックグラウンドからアクティビティを開始する代替手段として通知について説明します。また、制限が適用されない具体的なケースも示します。
代わりに通知を表示する
ほとんどの場合、バックグラウンドのアプリでは、アクティビティを直接開始するのではなく、時間的制約のある通知を表示して、ユーザーに緊急の情報を提供する必要があります。このような通知には、電話の着信やアクティブな目覚ましの処理などがあります。
この通知ベースのアラートおよびリマインダー システムは、ユーザーにとって次のようなメリットがあります。
- デバイスの使用時、ユーザーにはヘッドアップ通知が表示され、ユーザーが応答できるようになります。ユーザーは現在のコンテキストを維持し、画面に表示されるコンテンツを制御できます。
- 時間的制約のある通知は、ユーザーのサイレント モード ルールに従います。たとえば、サイレント モードが有効になっている場合、ユーザーは特定の連絡先や同一発信者による再着信のみを許可できます。
- デバイスの画面がオフの場合、全画面インテントがすぐに起動します。
- デバイスの [設定] 画面で、特定の通知チャンネルからの通知を含め、最近通知を送信したアプリを確認できます。この画面から、ユーザーは通知設定を制御できます。
アプリがアクティビティを開始できるタイミング
Android 10 以降で実行されているアプリは、次の 1 つ以上の条件が満たされると、アクティビティを起動できます。
- フォアグラウンドのアクティビティなど、可視ウィンドウがアプリに表示される。
- Android 14 以降では、アプリが
PendingIntent
を送信して、setPendingIntentBackgroundActivityStartMode (MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
でActivityOptions
バンドルを渡すことで、明示的にオプトインする必要があります。
- Android 14 以降では、アプリが
- アプリのアクティビティがフォアグラウンド タスクのバックスタックにある。
アプリの履歴画面で、既存のタスクのバックスタックにアクティビティがある。
アプリに、ごく最近開始されたアクティビティがある。
アプリがごく最近アクティビティで
finish()
を呼び出した。これは、finish()
が呼び出された時点で、アプリがフォアグラウンドにアクティビティを持っていたか、フォアグラウンド タスクのバックスタックにアクティビティがあったときにのみ適用されます。アプリに、システムによってバインドされている次のいずれかのサービスがある。これらのサービスでは、UI の起動が必要になる場合があります。
アプリに、別の表示可能なアプリによってバインドされているサービスがある。アクティビティを正常に開始するには、サービスにバインドされたアプリが、バックグラウンドでアプリから参照可能な状態を維持する必要があります。
アプリがシステムから通知
PendingIntent
を受信します。サービスとブロードキャスト レシーバのペンディング インテントの場合、アプリはペンディング インテントが送信されてから数秒間アクティビティを開始できます。アプリが、別の表示可能なアプリから送信される
PendingIntent
を受信します。アプリが UI を起動するシステム ブロードキャストを受信する。たとえば、
ACTION_NEW_OUTGOING_CALL
やSECRET_CODE_ACTION
などです。ブロードキャストの送信後、数秒間はアクティビティを開始できます。アプリが
CompanionDeviceManager
API を介してコンパニオン ハードウェア デバイスに関連付けられている。この API を使用すると、ペア設定済みのデバイスでユーザーが行った操作に応じて、アプリからアクティビティを開始できます。アプリが、デバイス所有者モードで動作するデバイス ポリシー コントローラである。ユースケースの例としては、フルマネージドのエンタープライズ デバイスや、デジタル サイネージやキオスクなどの専用デバイスがあります。
ユーザーによってアプリに
SYSTEM_ALERT_WINDOW
権限が付与されている。