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

アクティビティ起動動作は、起動モード(アプリの 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() メソッドには多くのセキュリティ制限が適用されます。