Schermata Recenti

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:

La schermata Recenti che mostra due documenti di Google Drive, ciascuno rappresentato come un'attività separata.

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:

La schermata Recenti mostra Chrome e Gmail 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 flag FLAG_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 e FLAG_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 e FLAG_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.

La schermata Recenti con un link per condividere i contenuti web visualizzati di recente.

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"));
    }
}