In Android 9 (und niedrigeren Versionen) wechselten Apps in den Status PAUSED, wenn:
- eine neue, durchscheinende Aktivität über der App gestartet wurde, während die App noch sichtbar war (und daher nicht beendet wurde).
- die Aktivität den Fokus verlor, aber nicht verdeckt war und der Nutzer mit ihr interagieren konnte. Im Mehrfenstermodus können beispielsweise mehrere Aktivitäten gleichzeitig sichtbar sein und Eingaben per Touch erhalten.
Diese Situationen unterscheiden sich in der Dauer der Pausierung einer App, können aber auf App-Ebene nicht unterschieden werden.
In Android 10 befinden sich alle Aktivitäten, die in sichtbaren Stacks den Fokus erhalten können, im Status RESUMED. Dadurch wird die Kompatibilität mit
dem Mehrfenstermodus und dem MD-Modus für Apps verbessert, die
onPause() anstelle von onStop() verwenden, um die Aktualisierung der Benutzeroberfläche zu beenden und die Interaktion
mit dem Nutzer zu unterbrechen. Das bedeutet:
- Beide Aktivitäten im Splitscreen-Modus werden fortgesetzt.
- Alle sichtbaren Aktivitäten im Freiform-Fenstermodus werden fortgesetzt.
- Aktivitäten auf mehreren Bildschirmen können gleichzeitig fortgesetzt werden.

Abbildung 1 : Mehrere Aktivitäten auf einem faltbaren Gerät fortsetzen

Abbildung 2 : Mehrere Aktivitäten im Desktopmodus fortsetzen
Aktivitäten können sich im Status PAUSED befinden, wenn sie nicht fokussiert werden können oder teilweise verdeckt sind, z. B.:
- In einem minimierten Splitscreen-Modus (mit Launcher an der Seite) wird die oberste Aktivität nicht fortgesetzt, da sie nicht fokussiert werden kann.
- Im Bild-im-Bild-Modus wird die Aktivität nicht fortgesetzt, da sie nicht fokussiert werden kann.
- Wenn Aktivitäten durch andere transparente Aktivitäten im selben Stack verdeckt werden.
Dieser Ansatz signalisiert Apps, dass eine Aktivität nur im Status RESUMED Eingaben von einem Nutzer erhalten kann. Vor Android 10 konnten Aktivitäten auch im Status PAUSED Eingaben erhalten (versuchen Sie beispielsweise, beide Aktivitäten im Splitscreen-Modus gleichzeitig auf einem Gerät mit Android 9 zu berühren).
Um das Signal resumed aus früheren Android-Versionen beizubehalten und zu kommunizieren, wann Apps Zugriff auf Ressourcen mit exklusivem Zugriff oder Singleton-Ressourcen erhalten sollten, enthält Android 10 einen neuen Callback:
Activity#onTopResumedActivityChanged(boolean onTop)
Wenn dieser Callback aufgerufen wird, erfolgt dies zwischen Activity#onResume() und Activity#onPause(). Dieser Callback ist optional und kann übersprungen werden, sodass eine Aktivität von RESUMED zu PAUSED wechseln kann, ohne die oberste im System zu werden. Zum Beispiel im Mehrfenstermodus.
Da dieser Callback optional ist, ist er nicht Teil des Aktivitätslebenszyklus und sollte nur selten verwendet werden.
Die vorherige oberste Aktivität im Status „resumed“ empfängt und beendet die Ausführung von onTopResumedActivity(false), bevor die nächste oberste Aktivität im Status „resumed“ onTopResumedActivity(true) empfängt. Dies gilt nicht, wenn die vorherige Aktivität zu viel Zeit für die Verarbeitung des Methodenaufrufs benötigt und das Zeitlimit von 500 ms erreicht.
Kompatibilität
Berücksichtigen Sie die folgenden Lösungen, um die Kompatibilität bei der Implementierung von mehreren fortgesetzten Aktivitäten beizubehalten.
Mehrere fortgesetzte Aktivitäten in einem App-Prozess
- Problem. In Android 9 und niedrigeren Versionen wird jeweils nur eine Aktivität im System fortgesetzt. Alle Übergänge zwischen Aktivitäten erfordern, dass eine Aktivität pausiert wird, bevor eine andere fortgesetzt wird. Einige Apps und Frameworks (z. B. Flutter oder Android LocalActivityManager) nutzen diese Tatsache und speichern den Status der fortgesetzten Aktivität in Singletons.
- Lösung. Wenn in Android 9 und niedrigeren Versionen zwei Aktivitäten aus demselben Prozess fortgesetzt werden, wird nur die Aktivität fortgesetzt, die in der Z-Reihenfolge höher liegt. Apps, die auf Android 10 ausgerichtet sind, können mehrere Aktivitäten gleichzeitig fortsetzen.
Gleichzeitiger Kamerazugriff
- Probleme. Diese Probleme treten auch in Android 9 und niedrigeren Versionen auf. Beispielsweise kann eine im Vollbildmodus ausgeführte und fortgesetzte Aktivität den Kamerafokus an eine pausierte Aktivität verlieren, die sich im Bild-im-Bild-Modus darüber befindet. Mit der breiteren Einführung von Mehrfenstermodi und Mehrbildschirmmodi wird dieses Problem jedoch häufiger auftreten.
- Aufgrund von Änderungen am Status
RESUMEkönnen Apps die Verbindung zur Kamera verlieren, auch wenn sie fortgesetzt werden. Um dieses Problem zu beheben, müssen Apps eine Trennung der Kamera ohne Absturz verarbeiten können. Wenn die Verbindung getrennt wird, erhalten Apps einen Callback für die Trennung und alle Aufrufe der API lösenCameraAccessExceptionaus. resizeableActivity=falsegarantiert keinen exklusiven Kamerazugriff, da andere Apps, die die Kamera verwenden, auf anderen Bildschirmen geöffnet werden können.
- Aufgrund von Änderungen am Status
- Lösungen. Entwickler sollten Logik für den Fall einbauen, dass die Verbindung einer App zur Kamera getrennt wird. Wenn die Verbindung einer App zur Kamera getrennt wird, sollte sie auf Rückrufe zur Kameraverfügbarkeit warten, um die Verbindung wiederherzustellen und die Kamera weiter zu verwenden. Zusätzlich zum vorhandenen Callback
CameraManager#AvailabilityCallback#onCameraAvailable()wurde in Android 10CameraManager#AvailabilityCallback#onCameraAccessPrioritiesChanged()hinzugefügt. Dieser Callback deckt den Fall ab, in dem der Fokus (und die Kamerapriorität) zwischen mehreren fortgesetzten Aktivitäten wechselt. App-Entwickler sollten beide Rückrufe verwenden, um einen geeigneten Zeitpunkt zu ermitteln, um Zugriff auf die Kamera zu erhalten.
Mehrere fortgesetzte Aktivitäten
In Android 10 wird der Aktivitätslebenszyklusstatus durch die Sichtbarkeit und die Z-Reihenfolge bestimmt. Um den richtigen Status nach Sichtbarkeitsaktualisierungen für eine Aktivität zu gewährleisten und zu ermitteln, welcher Lebenszyklusstatus anwendbar ist, rufen Sie die Methode ActivityRecord#makeActiveIfNeeded() von verschiedenen Stellen auf. In Android 10 bedeutet „aktiv“ entweder RESUMED oder PAUSED und funktioniert nur in diesen beiden Fällen.
In Android 10 wird das Fortsetzen einer Aktivität in jedem Stack separat erfasst und nicht an einer einzelnen Stelle im System. Das liegt daran, dass im Mehrfenstermodus mehrere Aktivitätsübergänge gleichzeitig ausgeführt werden können. Weitere Informationen finden Sie unter ActivityStack#mInResumeTopActivity.
Callback für die oberste Aktivität im Status „resumed“
Nach Aktionen, die zu einer Änderung der obersten Aktivität führen können (z. B. Aktivitätsstart, Fortsetzen oder Änderung der Z-Reihenfolge), wird ActivityStackSupervisor#updateTopResumedActivityIfNeeded() aufgerufen. Diese Methode prüft, ob sich die oberste Aktivität im Status „resumed“ geändert hat, und führt bei Bedarf die Aktualisierung durch. Wenn die vorherige oberste Aktivität im Status „resumed“ den Status nicht freigegeben hat, wird eine Nachricht über den Verlust des Status „oberste Aktivität im Status ‚resumed‘“ an sie gesendet und auf dem Server ein Zeitlimit festgelegt (ActivityStackSupervisor#scheduleTopResumedStateLossTimeout()). Ein Bericht über den Status „oberste Aktivität im Status ‚resumed‘“ wird an die nächste Aktivität gesendet, nachdem die vorherige den Status freigegeben hat oder wenn ein Zeitlimit erreicht wurde (siehe Verwendungen von:
ActivityStackSupervisor#scheduleTopResumedActivityStateIfNeeded()
Ein neues Transaktionselement TopResumedActivityChangeItem wurde hinzugefügt, um Änderungen am Status „oberste Aktivität im Status ‚resumed‘“ an Clients zu melden. Dabei wird die Architektur ActivityLifecycler aus Android 9 verwendet.
Der Status „oberste Aktivität im Status ‚resumed‘“ wird auf der Clientseite gespeichert. Jedes Mal, wenn die Aktivität zu RESUMED oder PAUSED wechselt, wird auch geprüft, ob der Callback onTopResumedActivityChanged() aufgerufen werden soll. Dadurch wird eine gewisse Entkopplung bei der Kommunikation von Lebenszyklusstatus und dem Status „oberste Aktivität im Status ‚resumed‘“ zwischen Server- und Clientseite ermöglicht.