Der Bildschirm „Zuletzt verwendet“ (auch „Übersicht“, „Liste der letzten Aufgaben“ oder „Bildschirm mit zuletzt verwendeten Apps“) ist eine Benutzeroberfläche auf Systemebene, in der die zuletzt aufgerufenen Aktivitäten und Aufgaben aufgeführt sind. Der Nutzer kann durch die Liste scrollen, eine Aufgabe zum Fortsetzen auswählen oder eine Aufgabe aus der Liste entfernen, indem er sie wegwischt.
Auf dem Bildschirm „Letzte Apps“ wird ein dokumentzentriertes Modell verwendet, das in Android 5.0 (API-Ebene 21) eingeführt wurde. Dabei können mehrere Instanzen derselben Aktivität mit unterschiedlichen Dokumenten als Aufgaben auf dem Bildschirm „Letzte Apps“ angezeigt werden. In Google Drive kann es beispielsweise für jedes von mehreren Google-Dokumenten eine Aufgabe geben. Jedes Dokument wird auf dem Bildschirm „Zuletzt verwendet“ als Aufgabe angezeigt:
Ein weiteres häufiges Beispiel ist, wenn der Nutzer seinen Browser verwendet und auf Teilen > Gmail tippt. Der Bildschirm Verfassen der Gmail App wird angezeigt. Wenn Sie zu diesem Zeitpunkt auf die Schaltfläche „Zuletzt verwendet“ tippen, werden Chrome und Gmail als separate Aufgaben angezeigt:
Normalerweise wird vom System festgelegt, wie Ihre Aufgaben und Aktivitäten auf dem Bildschirm „Letzte“ dargestellt werden. Sie müssen dieses Verhalten nicht ändern. Ihre App kann jedoch festlegen, wie und wann Aktivitäten auf dem Bildschirm „Letzte“ angezeigt werden.
Mit der Klasse ActivityManager.AppTask können Sie Aufgaben verwalten. Mit den Aktivitäts-Flags der Klasse Intent können Sie angeben, wann eine Aktivität dem Bildschirm „Letzte“ hinzugefügt oder daraus entfernt wird. Mit den Attributen <activity> können Sie das Verhalten im Manifest festlegen.
Aufgaben zum Bildschirm „Letzte“ hinzufügen
Wenn Sie die Flags der Klasse Intent verwenden, um eine Aufgabe hinzuzufügen, haben Sie mehr Kontrolle darüber, wann und wie ein Dokument auf dem Bildschirm „Zuletzt verwendet“ geöffnet oder wieder geöffnet wird. Wenn Sie die Attribute <activity> verwenden, können Sie auswählen, ob das Dokument immer in einer neuen Aufgabe geöffnet werden soll oder ob eine vorhandene Aufgabe für das Dokument wiederverwendet werden soll.
Intent-Flag zum Hinzufügen einer Aufgabe verwenden
Wenn Sie ein neues Dokument für Ihre Aktivität erstellen, rufen Sie die Methode startActivity() auf und übergeben ihr den Intent, mit dem die Aktivität gestartet wird. Wenn Sie einen logischen Break einfügen möchten, damit das System Ihre Activity als neue Aufgabe auf dem Bildschirm „Letzte“ behandelt, übergeben Sie das Flag FLAG_ACTIVITY_NEW_DOCUMENT in der Methode addFlags() des Intent, mit dem die Activity gestartet wird.
Wenn Sie beim Erstellen des neuen Dokuments das Flag FLAG_ACTIVITY_MULTIPLE_TASK festlegen, erstellt das System immer eine neue Aufgabe mit der Zielaktivität als Root. Mit dieser Einstellung kann dasselbe Dokument in mehreren Aufgaben geöffnet werden. Der folgende Code zeigt, wie die Hauptaktivität dies tut und die neue Aktivität über Ihr Composable startet:
private fun newDocumentIntent(context: Context): Intent = Intent(context, NewDocumentActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT or Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS) putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, documentCounter++) } @Composable fun CreateDocumentButton() { val context = LocalContext.current Button( onClick = { val intent = newDocumentIntent(context) // Add FLAG_ACTIVITY_MULTIPLE_TASK if needed based on state context.startActivity(intent) } ) { Text("Create New Document") } }
Wenn die Hauptaktivität eine neue Aktivität startet, sucht das System in vorhandenen Tasks nach einem Task, dessen Intent mit dem Namen der Intent-Komponente und den Intent-Daten für die Aktivität übereinstimmt. Wenn die Aufgabe nicht gefunden wird oder die Intention das Flag FLAG_ACTIVITY_MULTIPLE_TASK enthält, wird eine neue Aufgabe mit der Aktivität als Stamm erstellt.
Wenn das System eine Aufgabe findet, deren Intention mit dem Namen der Intent-Komponente und den Intent-Daten übereinstimmt, wird diese Aufgabe in den Vordergrund gerückt und die neue Intention an onNewIntent() übergeben.
Die neue Aktivität erhält den Intent und erstellt ein neues Dokument auf dem Bildschirm „Zuletzt verwendet“, wie im folgenden Beispiel gezeigt:
class DocumentCentricActivity : ComponentActivity() { private var documentState by mutableStateOf( DocumentState( count = 0, textResId = R.string.hello_new_document_counter ) ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val initialCount = intent.getIntExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0) documentState = documentState.copy(count = initialCount) setContent { MaterialTheme { DocumentScreen( count = documentState.count, textResId = documentState.textResId ) } } } override fun onNewIntent(newIntent: Intent) { super.onNewIntent(newIntent) // If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this Activity is reused. documentState = documentState.copy( textResId = R.string.reusing_document_counter ) } data class DocumentState(val count: Int, @StringRes val textResId: Int) companion object { const val KEY_EXTRA_NEW_DOCUMENT_COUNTER = "KEY_EXTRA_NEW_DOCUMENT_COUNTER" } } @Composable fun DocumentScreen(count: Int, @StringRes textResId: Int) { Column( modifier = Modifier .fillMaxSize() .padding(16.dp), verticalArrangement = Arrangement.Center ) { // UI reacts to whichever string resource ID was passed down Text(text = stringResource(id = textResId)) Spacer(modifier = Modifier.height(8.dp)) Text(text = "Counter: $count") } }
Im vorherigen Code übernimmt die Aktivität das Routing auf Betriebssystemebene (onCreate und onNewIntent), während die Funktion @Composable nur für das Rendern der Benutzeroberfläche basierend auf dem bereitgestellten Status verantwortlich ist.
Aufgabe mit dem Attribut „activity“ hinzufügen
Eine Aktivität kann in ihrem Manifest auch angeben, dass sie immer in einer neuen Aufgabe gestartet wird. Verwenden Sie dazu das Attribut <activity> android:documentLaunchMode.
Dieses Attribut hat vier Werte, die beim Öffnen eines Dokuments mit der Anwendung die folgenden Auswirkungen haben:
intoExisting- Bei der Aktivität wird eine vorhandene Aufgabe für das Dokument wiederverwendet. Das ist dasselbe wie das Festlegen des Flags
FLAG_ACTIVITY_NEW_DOCUMENTohne das FlagFLAG_ACTIVITY_MULTIPLE_TASKfestzulegen, wie im Abschnitt Aufgabe mit dem Intent-Flag hinzufügen beschrieben. always- Durch die Aktivität wird eine neue Aufgabe für das Dokument erstellt, auch wenn das Dokument bereits geöffnet ist. Die Verwendung dieses Werts entspricht dem Festlegen der Flags
FLAG_ACTIVITY_NEW_DOCUMENTundFLAG_ACTIVITY_MULTIPLE_TASK. none- Durch die Aktivität wird keine neue Aufgabe für das Dokument erstellt. Auf dem Bildschirm „Letzte“ wird die Aktivität wie standardmäßig behandelt. Es wird eine einzelne Aufgabe für die App angezeigt, die mit der letzten Aktivität fortgesetzt wird, die der Nutzer aufgerufen hat.
never- Durch die Aktivität wird keine neue Aufgabe für das Dokument erstellt. Wenn Sie diesen Wert festlegen, wird das Verhalten der Flags
FLAG_ACTIVITY_NEW_DOCUMENTundFLAG_ACTIVITY_MULTIPLE_TASKüberschrieben. Wenn eine dieser Optionen im Intent festgelegt ist und auf dem Bildschirm „Zuletzt verwendet“ nur eine Aufgabe für die App angezeigt wird, wird die App mit der Aktivität fortgesetzt, die der Nutzer zuletzt aufgerufen hat.
Aufgaben entfernen
Standardmäßig wird eine Dokumentaufgabe automatisch aus dem Bildschirm „Letzte“ entfernt, wenn die Aktivität abgeschlossen ist. Sie können dieses Verhalten mit der Klasse ActivityManager.AppTask, mit dem Flag Intent oder mit dem Attribut <activity> überschreiben.
Sie können eine Aufgabe jederzeit vollständig aus dem Bildschirm „Zuletzt verwendet“ ausschließen, indem Sie das Attribut <activity> android:excludeFromRecents auf true festlegen.
Sie können die maximale Anzahl von Aufgaben festlegen, die Ihre App auf dem Bildschirm „Letzte Apps“ anzeigen kann, indem Sie das Attribut <activity> android:maxRecents auf einen Ganzzahlwert festlegen. Wenn die maximale Anzahl von Aufgaben erreicht ist, wird die Aufgabe, die am längsten nicht verwendet wurde, nicht mehr auf dem Bildschirm „Letzte“ angezeigt. Der Standardwert ist 16 und der Höchstwert 50 (25 auf Geräten mit wenig Arbeitsspeicher). Werte unter 1 sind ungültig.
Klasse „AppTask“ zum Entfernen von Aufgaben verwenden
In der Aktivität, die eine neue Aufgabe auf dem Bildschirm „Letzte“ erstellt, können Sie angeben, wann die Aufgabe entfernt und alle zugehörigen Aktivitäten beendet werden sollen. Rufen Sie dazu die Methode finishAndRemoveTask() auf:
@Composable fun RemoveTaskButton() { val context = LocalContext.current Button( onClick = { // It is good practice to remove a document from the overview stack if not needed anymore. (context as? Activity)?.finishAndRemoveTask() } ) { Text("Remove from Recents") } }
Erledigte Aufgaben beibehalten
Wenn Sie eine Aufgabe auf dem Bildschirm „Letzte“ beibehalten möchten, auch wenn ihre Aktivität beendet ist, übergeben Sie das Flag FLAG_ACTIVITY_RETAIN_IN_RECENTS in der Methode addFlags() des Intents, mit dem die Aktivität gestartet wird.
private fun newDocumentIntent() = Intent(this, NewDocumentActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT or android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS) putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, getAndIncrement()) }
Um denselben Effekt zu erzielen, setzen Sie das Attribut <activity> android:autoRemoveFromRecents auf false. Der Standardwert ist true für Dokumentaktivitäten und false für reguläre Aktivitäten. Wenn Sie dieses Attribut verwenden, wird das Flag FLAG_ACTIVITY_RETAIN_IN_RECENTS überschrieben.
URL-Freigabe für zuletzt besuchte Websites aktivieren (nur Pixel)
Auf Pixel-Geräten mit Android 12 oder höher können Nutzer Links zu kürzlich aufgerufenen Webinhalten direkt über den Bildschirm „Zuletzt verwendet“ teilen. Nachdem der Nutzer die Inhalte in einer App aufgerufen hat, kann er zum Bildschirm „Letzte“ wischen und die App finden, in der er sich die Inhalte angesehen hat. Anschließend kann er auf die Link-Schaltfläche tippen, um die URL zu kopieren oder zu teilen.
Jede App kann die Verknüpfung mit „Zuletzt verwendet“ für Nutzer aktivieren, indem sie eine Web-Benutzeroberfläche bereitstellt und onProvideAssistContent() überschreibt, wie im folgenden Beispiel gezeigt:
class MainActivity : ComponentActivity() { // Track the current URL as state so the UI can update it during navigation private var currentWebUri by mutableStateOf("https://example.com/home") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { AppTheme { // Pass a lambda to your Compose UI so it can update the URL state // as the user navigates through your app. MainScreen( onPageChanged = { newUrl -> currentWebUri = newUrl } ) } } } override fun onProvideAssistContent(outContent: AssistContent) { super.onProvideAssistContent(outContent) // The system calls this when the user enters the Recents screen. // Provide the active URI tracked by the Compose state. outContent.webUri = Uri.parse(currentWebUri) } }