Das Startverhalten von Aktivitäten wird durch Startmodi in den AndroidManifest.xml-Dateien von Apps, Intent-Flags und ActivityOptions definiert, die vom Aufrufer bereitgestellt werden. Verwenden Sie ActivityOption#setLaunchDisplayId(int), um ein bestimmtes Display für den Start der Aktivität festzulegen.
- Standardmäßig wird die Aktivität auf demselben Display gestartet wie der Aufrufer. Eine neue Instanz einer Aktivität, die über den Launcher gestartet wurde, sollte beispielsweise ohne zusätzliche Flags oder Optionen auf demselben Display platziert werden. Achten Sie darauf, dass Sie für den Start den richtigen Kontext verwenden (Aktivität im Vergleich zu Anwendung).
- Wenn der Start von einer Quelle aus erfolgt, die nicht mit einem bestimmten Display verknüpft ist (z. B. über eine Shell oder einen Anwendungskontext), wird die Aktivität auf dem obersten Display platziert, auf dem der Nutzer zuletzt mit dem Gerät interagiert hat oder von dem aus die letzte Aktivität gestartet wurde.
- Der Intent zum Starten einer Aktivität kann in eine vorhandene Aktivitätsinstanz im System aufgelöst werden. Wenn in diesem Fall keine zusätzlichen Flags angegeben wurden, wird eine Aktivität auf demselben Display angezeigt, auf dem sie zuletzt verwendet wurde. Wenn das Ziel-Display mit
ActivityOptions#setTargetDisplayId()angegeben wird, wird die Aktivität auf dieses Display verschoben (sofern dies durch Sicherheits- und andere Einschränkungen zulässig ist).
Sicherheitseinschränkungen
Damit eine schädliche App keine nutzerbezogenen vertraulichen Informationen missbrauchen kann, indem sie diese von der Oberfläche eines von ihr erstellten virtuellen Displays liest, können Apps in Android 10 eigene Aktivitäten nur auf einem von ihnen erstellten virtuellen Display starten. Aber:
- Systemkomponenten mit der Berechtigung
INTERNAL_SYSTEM_WINDOWkönnen auf jedem Display gestartet werden. - Aufrufer mit der Berechtigung
ACTIVITY_EMBEDDINGkönnen Aktivitäten aus anderen Apps starten, die das FlagActivityInfo.FLAG_ALLOW_EMBEDDEDhaben. - Aktivitätsstarts auf privaten Displays sind nur für den Inhaber oder für Aktivitäten zulässig, die auf diesem Display vorhanden sind.
Ähnliche Einschränkungen gelten für das Hinzufügen von Fenstern zu Displays.
Android 10 includes the
ActivityManager#isActivityStartAllowedOnDisplay(Context context, int
displayId, Intent intent) method to check security restrictions for the
App geprüft werden, bevor versucht wird, sie auf einem Display zu starten. Unter Android 9 und niedriger führen eingeschränkte Starts zu SecurityException.
Die meisten Sicherheitseinschränkungen werden in der Methode ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay() angewendet.