Android 10 (API レベル 29) 以上では、バックグラウンドで実行されているアプリに対してアクティビティを開始できる状況に制限があります。この制限が設けられているのは、ユーザー操作の中断を最小限にして、ユーザーが画面に表示されているアプリをよりよく制御できるようにするためです。
このガイドでは、バックグラウンドからアクティビティを開始する代わりに使用できる、通知という方法について説明します。さらに、制限が適用されない特定のケースを列挙します。
代替手段として通知を表示する
バックグラウンドのアプリからユーザーに緊急な情報を伝える必要があるとき、たいていは、アクティビティを直接に開始するのではなく、時間に依存する通知を表示するほうが望ましいものです。このような通知は、電話の着信時やアラームが作動したときの処理などに使用されています。
この通知ベースのアラートおよびリマインダのシステムは、ユーザーにとっていくつかの利点があります。
- 端末を使用中に、ヘッドアップ通知が表示され、ユーザーはその通知に対応できます。ユーザーは現在のコンテキストを維持しつつ、画面に表示されるコンテンツを制御できます。
- 時間に依存する通知は、ユーザーの サイレント モードの規則を尊重します。たとえば、「サイレント モード」を有効にするとき、ユーザーは特定の連絡先からの着信や繰り返しかかってくる着信のみを許可することができます。
- 端末の画面がオフになっている場合は、直ちにインテントが全画面で起動します。
- 端末の設定画面には、特定の通知チャンネルから送られたものを含め、最近通知を送信したアプリケーションが表示されます。ユーザーはこの画面で通知設定を制御できます。
制限の例外
Android 10 以上で実行されているアプリは、次のうち 1 つ以上の条件を満たしたときにのみアクティビティを開始できます。
- アプリのウィンドウが、フォアグラウンドのアクティビティであるなど、画面上に表示されている。
- アプリのアクティビティが、フォアグラウンド タスクのバック スタックにある。
アプリのアクティビティが、最近使ったアプリ画面の既存タスクのバックスタックにある。
ごく最近開始した、このアプリのアクティビティがある。
ごく最近、このアプリがアクティビティで
finish()
を呼び出した。これは、finish()
が呼び出されたときに、このアプリのアクティビティがフォアグラウンドにあった、またはフォアグラウンド タスクのバック スタックにあった場合のみに適用されます。システムによってバインドされたサービスがこのアプリにある。この条件は次のサービスにのみ適用されます(UI の起動が必要となる場合があります)。
AccessibilityService
、AutofillService
、CallRedirectionService
、HostApduService
、InCallService
、TileService
、VoiceInteractionService
、およびVrListenerService
。このアプリには、表示されている別のアプリによってバインドされたサービスがある。バックグラウンドのアプリが正常にアクティビティを開始できるようにするため、そのサービスにバインドされているアプリは表示されたままでなければなりません。
このアプリがシステムから通知
PendingIntent
を受信している。サービスやブロードキャスト受信プログラムのインテントが保留中の場合は、保留中のインテントが送信されてから数秒間アプリはアクティビティを開始できます。表示されている別のアプリから送信された
PendingIntent
をこのアプリが受信している。アプリがシステム ブロードキャストを受信し、そのための UI を起動することになっている。その例として、
ACTION_NEW_OUTGOING_CALL
とSECRET_CODE_ACTION
があります。アプリは、ブロードキャストが送信されてから数秒間はアクティビティを開始できます。アプリが
CompanionDeviceManager
API によって付属ハードウェア端末に関連付けられている。この API により、アプリはペア設定した端末でユーザーが実行するアクションに反応して、アクティビティを開始できます。アプリが端末所有者モードで実行されている端末ポリシー コントローラである。使用例には、完全管理対象エンタープライズ端末だけでなく、デジタル サイネージやキオスクなどの専用端末も含まれています。
ユーザーによってアプリに
SYSTEM_ALERT_WINDOW
パーミッションが付与されている。