La schermata Recenti, chiamata anche schermata Panoramica, Elenco di attività recenti o schermata App recenti, è un'interfaccia utente a livello di sistema che elenca le attività e le attività a cui si è eseguito l'accesso di recente. L'utente può scorrere l'elenco, selezionare un'attività da riprendere o rimuoverla dall'elenco facendola scorrere per eliminarla.
La schermata Recenti utilizza un modello incentrato sui documenti, introdotto in Android 5.0 (livello API 21), in cui più istanze della stessa attività contenenti documenti diversi possono essere visualizzate come attività nella schermata Recenti. Ad esempio, Google Drive potrebbe avere un'attività per diversi documenti Google. Ogni documento viene visualizzato come attività nella schermata Recenti:
Un altro esempio comune è quando l'utente, utilizzando il browser, tocca Condividi > Gmail. Viene visualizzata la schermata Scrivi dell'app Gmail. Se tocchi il pulsante Recenti in quel momento, Chrome e Gmail sono in esecuzione come attività separate:
Di solito, puoi consentire al sistema di definire il modo in cui le tue attività vengono rappresentate nella schermata Recenti. Non devi modificare questo comportamento. Tuttavia, l'app può determinare come e quando visualizzare le attività nella schermata Recenti.
Il corso ActivityManager.AppTask
ti consente di gestire le attività, mentre i flag attività della classe Intent
ti consentono di specificare quando un'attività viene aggiunta o rimossa dalla schermata Recenti. Inoltre, gli attributi <activity>
consentono di impostare il comportamento nel manifest.
Aggiungi attività alla schermata Recenti
L'utilizzo dei flag della classe Intent
per aggiungere un'attività offre un maggiore controllo su quando e come un documento viene aperto o riaperto nella schermata Recenti. Quando utilizzi gli attributi <activity>
, puoi scegliere se aprire sempre il documento in una nuova attività o riutilizzare un'attività esistente per il documento.
Utilizzare il flag dell'intent per aggiungere un'attività
Quando crei un nuovo documento per la tua attività, chiami il metodo startActivity()
, passando all'intent che avvia l'attività. Per inserire un'interruzione logica in modo che il sistema tratti l'attività come nuova attività nella schermata Recenti, passa il flag FLAG_ACTIVITY_NEW_DOCUMENT
nel metodo addFlags()
del Intent
che avvia l'attività.
Se imposti il flag FLAG_ACTIVITY_MULTIPLE_TASK
quando crei il nuovo documento, il sistema crea sempre una nuova attività con l'attività di destinazione come principale. Questa impostazione consente di aprire
lo stesso documento in più attività. Il seguente codice mostra come l'attività principale
lo fa:
Kotlin
fun createNewDocument(view: View) { val newDocumentIntent = newDocumentIntent() if (useMultipleTasks) { newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK) } startActivity(newDocumentIntent) } private fun newDocumentIntent(): Intent = 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, documentCounter++) }
Java
public void createNewDocument(View view) { final Intent newDocumentIntent = newDocumentIntent(); if (useMultipleTasks) { newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); } startActivity(newDocumentIntent); } private Intent newDocumentIntent() { boolean useMultipleTasks = checkbox.isChecked(); final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class); newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, documentCounter++); return newDocumentIntent; } }
Quando l'attività principale avvia una nuova attività, il sistema ne cerca una il cui intent corrisponda al nome del componente intent e ai dati dell'intent per l'attività in questione. Se l'attività non viene trovata o se l'intent conteneva il flag FLAG_ACTIVITY_MULTIPLE_TASK
, viene creata una nuova attività con l'attività come radice.
Se il sistema trova un'attività il cui intent corrisponde al nome del componente intent e ai dati sugli intent, la porta in primo piano e passa il nuovo intent a onNewIntent()
.
La nuova attività ottiene l'intent e crea un nuovo documento nella schermata Recenti, come mostrato nell'esempio seguente:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_new_document) documentCount = intent .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0) documentCounterTextView = findViewById(R.id.hello_new_document_text_view) setDocumentCounterText(R.string.hello_new_document_counter) } override fun onNewIntent(newIntent: Intent) { super.onNewIntent(newIntent) /* If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this Activity will be reused. */ setDocumentCounterText(R.string.reusing_document_counter) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_new_document); documentCount = getIntent() .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0); documentCounterTextView = (TextView) findViewById( R.id.hello_new_document_text_view); setDocumentCounterText(R.string.hello_new_document_counter); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); /* If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this activity is reused to create a new document. */ setDocumentCounterText(R.string.reusing_document_counter); }
Utilizza l'attributo activity per aggiungere un'attività
Un'attività può anche specificare nel file manifest che viene sempre avviata in una nuova attività utilizzando l'attributo <activity>
android:documentLaunchMode
.
Questo attributo ha quattro valori, che producono i seguenti effetti quando l'utente apre un documento con l'applicazione:
intoExisting
- L'attività riutilizza un'attività esistente per il documento. Equivale a impostare il flag
FLAG_ACTIVITY_NEW_DOCUMENT
senza impostare il flagFLAG_ACTIVITY_MULTIPLE_TASK
, come descritto nella sezione Utilizzare il flag di intent per aggiungere un'attività. always
- L'attività crea una nuova attività per il documento, anche se il documento è già aperto. Utilizzare questo valore equivale a impostare i flag
FLAG_ACTIVITY_NEW_DOCUMENT
eFLAG_ACTIVITY_MULTIPLE_TASK
. none
- L'attività non crea una nuova attività per il documento. La schermata Recenti tratta l'attività come farebbe per impostazione predefinita. Visualizza una singola attività per l'app, che riprende dall'ultima attività richiamata dall'utente.
never
- L'attività non crea una nuova attività per il documento. L'impostazione di questo valore sostituisce il comportamento dei flag
FLAG_ACTIVITY_NEW_DOCUMENT
eFLAG_ACTIVITY_MULTIPLE_TASK
. Se una di queste opzioni è impostata nell'intent e la schermata Recenti mostra una singola attività per l'app, viene ripristinata dall'ultima attività richiamata dall'utente.
Rimuovere le attività
Per impostazione predefinita, un'attività documento esce automaticamente dalla schermata Recenti al termine della sua attività. Puoi eseguire l'override di questo comportamento con la classe ActivityManager.AppTask
, con un flag Intent
o con un attributo <activity>
.
Puoi sempre escludere completamente un'attività dalla schermata Recenti impostando l'attributo <activity>
android:excludeFromRecents
su true
.
Puoi impostare il numero massimo di attività che la tua app può includere nella
schermata Recenti impostando
l'attributo <activity>
android:maxRecents
su un
valore intero. Quando viene raggiunto il numero massimo di attività,
l'attività meno utilizzata scompare dalla schermata Recenti. Il valore predefinito è 16 e il valore massimo è 50 (25 sui dispositivi con memoria insufficiente). I valori inferiori a 1 non sono validi.
Utilizzare il corso AppTask per rimuovere le attività
Nell'attività che crea una nuova attività nella schermata Recenti, puoi specificare quando rimuovere l'attività e terminare tutte le attività associate chiamando il metodo finishAndRemoveTask()
:
Kotlin
fun onRemoveFromOverview(view: View) { // It is good pratice to remove a document from the overview stack if not needed anymore. finishAndRemoveTask() }
Java
public void onRemoveFromRecents(View view) { // The document is no longer needed; remove its task. finishAndRemoveTask(); }
Conserva le attività completate
Se vuoi conservare un'attività nella schermata Recenti, anche se la sua attività è stata completata, passa il flag FLAG_ACTIVITY_RETAIN_IN_RECENTS
con il metodo addFlags()
dell'intent che avvia l'attività.
Kotlin
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()) }
Java
private Intent newDocumentIntent() { final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class); newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS); newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, getAndIncrement()); return newDocumentIntent; }
Per ottenere lo stesso effetto, imposta l'attributo <activity>
android:autoRemoveFromRecents
su false
. Il valore predefinito è true
per le attività relative ai documenti e false
per
le attività normali. L'utilizzo di questo attributo sostituisce il flag FLAG_ACTIVITY_RETAIN_IN_RECENTS
.
Abilita la condivisione di URL recenti (solo Pixel)
Sui dispositivi Pixel con Android 12 o versioni successive, gli utenti possono condividere link ai contenuti web visualizzati di recente direttamente dalla schermata Recenti. Dopo aver visitato i contenuti in un'app, l'utente può scorrere fino alla schermata Recenti e trovare l'app in cui ha visualizzato i contenuti, quindi toccare il pulsante del link per copiare o condividere l'URL.
Qualsiasi app può attivare il collegamento di recenti per gli utenti fornendo un'interfaccia utente web e eseguendo l'override di onProvideAssistContent()
, come mostrato nell'esempio seguente:
Kotlin
class MainActivity : AppCompatActivity() { protected fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } fun onProvideAssistContent(outContent: AssistContent) { super.onProvideAssistContent(outContent) outContent.setWebUri(Uri.parse("https://example.com/myCurrentPage")) } }
Java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public void onProvideAssistContent(AssistContent outContent) { super.onProvideAssistContent(outContent); outContent.setWebUri(Uri.parse("https://example.com/myCurrentPage")); } }