Écran "Récents"

L'écran "Recents" (Éléments récents), également appelé "Overview" (Aperçu), "Recent Tasks" (Liste des tâches récentes) ou "Recent Apps" (Applications récentes), est une interface utilisateur au niveau du système qui répertorie les activités et tâches récemment consultées. L'utilisateur peut parcourir la liste, sélectionner une tâche à reprendre ou supprimer une tâche de la liste en la faisant glisser.

L'écran "Recents" (Éléments récents) utilise un modèle centré sur les documents, introduit dans Android 5.0 (niveau d'API 21), dans lequel plusieurs instances de la même activité contenant différents documents peuvent apparaître en tant que tâches dans l'écran "Recents" (Éléments récents). Par exemple, Google Drive peut avoir une tâche pour chacun des plusieurs documents Google. Chaque document apparaît sous la forme d'une tâche sur l'écran "Recents" (Éléments récents) :

Écran "Récents" affichant deux documents Google Drive, chacun représentant une tâche distincte.

Autre exemple courant : lorsque l'utilisateur se sert de son navigateur et qu'il appuie sur Partager > Gmail. L'écran Nouveau message de l'application Gmail s'affiche. Si vous appuyez sur le bouton "Récents", Chrome et Gmail s'exécutent comme des tâches distinctes:

Écran "Récents" affichant Chrome et Gmail comme des tâches distinctes.

Normalement, vous laissez le système définir la manière dont vos tâches et activités sont représentées dans l'écran "Recents" (Éléments récents). Vous n'avez pas besoin de modifier ce comportement. Cependant, votre application peut déterminer comment et quand les activités s'affichent dans l'écran "Recents" (Éléments récents).

La classe ActivityManager.AppTask vous permet de gérer des tâches, et les indicateurs d'activité de la classe Intent vous permettent de spécifier quand une activité est ajoutée ou supprimée de l'écran "Recents" (Éléments récents). En outre, les attributs <activity> vous permettent de définir le comportement dans le fichier manifeste.

Ajouter des tâches à l'écran "Recents" (Éléments récents)

L'utilisation des indicateurs de la classe Intent pour ajouter une tâche vous permet de mieux contrôler quand et comment un document est ouvert ou rouvert dans l'écran "Recents" (Éléments récents). Lorsque vous utilisez les attributs <activity>, vous pouvez choisir de toujours ouvrir le document dans une nouvelle tâche ou de réutiliser une tâche existante pour le document.

Utiliser l'indicateur d'intent pour ajouter une tâche

Lorsque vous créez un document pour votre activité, vous appelez la méthode startActivity(), en lui transmettant l'intent qui lance l'activité. Pour insérer une pause logique afin que le système traite votre activité comme une nouvelle tâche dans l'écran "Recents" (Éléments récents), transmettez l'option FLAG_ACTIVITY_NEW_DOCUMENT dans la méthode addFlags() du Intent qui lance l'activité.

Si vous définissez l'option FLAG_ACTIVITY_MULTIPLE_TASK lorsque vous créez le document, le système crée toujours une tâche avec l'activité cible comme racine. Ce paramètre permet d'ouvrir le même document dans plusieurs tâches. Le code suivant montre comment l'activité principale effectue cette opération:

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

}

Lorsque l'activité principale lance une nouvelle activité, le système recherche dans les tâches existantes celle dont l'intent correspond au nom du composant d'intent et aux données d'intent de l'activité. Si la tâche est introuvable ou si l'intent contenait l'indicateur FLAG_ACTIVITY_MULTIPLE_TASK, une tâche est créée avec l'activité comme racine.

Si le système trouve une tâche dont l'intent correspond au nom du composant d'intent et aux données de l'intent, il met cette tâche au premier plan et transmet le nouvel intent à onNewIntent(). La nouvelle activité récupère l'intent et crée un document sur l'écran "Recents" (Éléments récents), comme illustré dans l'exemple suivant:

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

Utiliser l'attribut d'activité pour ajouter une tâche

Une activité peut également spécifier dans son fichier manifeste qu'elle lance toujours une nouvelle tâche à l'aide de l'attribut <activity> android:documentLaunchMode. Cet attribut présente quatre valeurs, ce qui entraîne les effets suivants lorsque l'utilisateur ouvre un document avec l'application:

intoExisting
L'activité réutilise une tâche existante pour le document. Cela revient à définir l'option FLAG_ACTIVITY_NEW_DOCUMENT sans définir l'option FLAG_ACTIVITY_MULTIPLE_TASK, comme décrit dans la section Utiliser l'indicateur d'intent pour ajouter une tâche.
always
L'activité crée une tâche pour le document, même s'il est déjà ouvert. L'utilisation de cette valeur revient à définir les options FLAG_ACTIVITY_NEW_DOCUMENT et FLAG_ACTIVITY_MULTIPLE_TASK.
none
L'activité ne crée pas de tâche pour le document. L'écran "Recents" (Éléments récents) traite l'activité comme il le ferait par défaut. Il affiche une seule tâche pour l'application, qui reprend à partir de la dernière activité appelée par l'utilisateur.
never
L'activité ne crée pas de tâche pour le document. La définition de cette valeur remplace le comportement des options FLAG_ACTIVITY_NEW_DOCUMENT et FLAG_ACTIVITY_MULTIPLE_TASK. Si l'un de ces éléments est défini dans l'intent et que l'écran "Recents" (Éléments récents) affiche une seule tâche pour l'application, elle reprend à partir de la dernière activité appelée par l'utilisateur.

Supprimer des tâches

Par défaut, une tâche de document quitte automatiquement l'écran "Recents" (Éléments récents) lorsque son activité est terminée. Vous pouvez ignorer ce comportement avec la classe ActivityManager.AppTask, avec un indicateur Intent ou avec un attribut <activity>.

Vous pouvez toujours exclure complètement une tâche de l'écran "Recents" (Éléments récents) en définissant l'attribut <activity> android:excludeFromRecents sur true.

Vous pouvez définir le nombre maximal de tâches que votre application peut inclure dans l'écran "Recents" (Éléments récents) en définissant l'attribut <activity> android:maxRecents sur une valeur entière. Lorsque le nombre maximal de tâches est atteint, la tâche la moins récemment utilisée disparaît de l'écran "Recents" (Éléments récents). La valeur par défaut est 16 et la valeur maximale est 50 (25 sur les appareils à faible mémoire). Les valeurs inférieures à 1 ne sont pas valides.

Utiliser la classe AppTask pour supprimer des tâches

Dans l'activité qui crée une tâche sur l'écran "Recents" (Éléments récents), vous pouvez spécifier quand supprimer la tâche et terminer toutes les activités qui lui sont associées en appelant la méthode 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();
}

Conserver les tâches terminées

Si vous souhaitez conserver une tâche dans l'écran "Recents" (Éléments récents), même si son activité est terminée, transmettez l'indicateur FLAG_ACTIVITY_RETAIN_IN_RECENTS dans la méthode addFlags() de l'intent qui lance l'activité.

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

Pour obtenir le même effet, définissez l'attribut <activity> android:autoRemoveFromRecents sur false. La valeur par défaut est true pour les activités de document et false pour les activités régulières. L'utilisation de cet attribut remplace l'option FLAG_ACTIVITY_RETAIN_IN_RECENTS.

Activer le partage des URL récentes (Pixel uniquement)

Sur les appareils Pixel équipés d'Android 12 ou version ultérieure, les utilisateurs peuvent partager des liens vers du contenu Web récemment consulté directement depuis l'écran "Recents" (Éléments récents). Après avoir consulté le contenu dans une application, l'utilisateur peut balayer l'écran vers l'écran "Recents" (Éléments récents) et trouver l'application dans laquelle il a consulté le contenu, puis appuyer sur le bouton "Lien" pour copier ou partager l'URL.

Écran "Recents" (Éléments récents) avec un lien permettant de partager le contenu Web consulté récemment.

Toute application peut activer l'association de contenus récents pour les utilisateurs en fournissant une interface utilisateur Web et en remplaçant onProvideAssistContent(), comme illustré dans l'exemple suivant:

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