アクティビティ起動ポリシー

アクティビティ起動動作は、アプリの AndroidManifest.xml ファイルの起動モード、インテント フラグ、呼び出し元によって指定される ActivityOptions で定義されます。特定のディスプレイをアクティビティの起動のターゲットとするには、ActivityOption#setLaunchDisplayId(int) を使用します。

  • デフォルトでは、アクティビティは呼び出し元と同じディスプレイで起動します。たとえば、ランチャーから起動されたアクティビティの新しいインスタンスは、フラグまたはオプションを追加せずに同じディスプレイに配置する必要があります。起動には適切なコンテキスト(アクティビティとアプリ)を使用してください。
  • 特定のディスプレイに関連付けられていないソース(シェルやアプリ コンテキストなど)から起動された場合は、ユーザーが最後にデバイスを操作したか、最後のアクティビティが起動された最上位のディスプレイにアクティビティが配置されます。
  • アクティビティを起動するインテントは、システム内の既存のアクティビティ インスタンスに解決できます。この場合は追加のフラグが指定されていないと、最後に使用されたディスプレイにアクティビティが表示されます。ターゲット ディスプレイが ActivityOptions#setTargetDisplayId() で指定されている場合、アクティビティはそのディスプレイに移動されます(セキュリティやその他の制限によって許可されている場合)。

セキュリティ制限

悪意のあるアプリが作成した仮想ディスプレイの表面からユーザーの機密情報を読み取って悪用しないように、アプリは Android 10 で作成した仮想ディスプレイでのみ独自のアクティビティを起動できます。ただし、次の例外があります。

  • INTERNAL_SYSTEM_WINDOW 権限があるシステム コンポーネントはどのディスプレイでも起動できます
  • ACTIVITY_EMBEDDING 権限がある呼び出し元は、フラグ ActivityInfo.FLAG_ALLOW_EMBEDDED がある他のアプリからアクティビティを起動できます
  • 非公開ディスプレイでアクティビティを起動できるのは、所有者、またはそのディスプレイに表示されているアクティビティのみです

ディスプレイへのウィンドウの追加にも同様の制限が適用されます。

Android 10 には、ディスプレイ上で起動する前にアプリのセキュリティ制限を確認する ActivityManager#isActivityStartAllowedOnDisplay(Context context, int displayId, Intent intent) メソッドが含まれています。Android 9 以前では、起動が制限されると SecurityException がスローされます。

ほとんどのセキュリティ制限は、ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay() メソッドに適用されます。