Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Pantalla Recientes

La pantalla Recientes (a la que también se hace referencia como lista de tareas recientes o apps recientes) es una IU en el nivel del sistema en la que se enumeran las actividades y tareas a las que se accedió recientemente. El usuario puede navegar por la lista y seleccionar la tarea que quiera reanudar o puede deslizar con el dedo para quitar alguna de la lista. En Android 5.0 (API nivel 21), se introduce un modelo centrado en documentos, en el que varias instancias de una misma actividad que contiene diferentes documentos pueden aparecer como tareas en la pantalla Recientes. Por ejemplo, Google Drive podría tener una tarea para cada uno de los documentos de Google. Cada documento aparece como una tarea en la pantalla Recientes.

Figura 1: En la pantalla Recientes, se muestran tres documentos de Google Drive y cada uno se representa como una tarea independiente.

Otro ejemplo común es cuando el usuario usa su navegador y presiona Compartir > Gmail. Aparece la pantalla Redactarde la app de Gmail. Si presionas el botón Recientes en ese momento, verás que Chrome y Gmail se ejecutan como tareas independientes. En versiones anteriores de Android, todas las actividades aparecen como una única tarea, lo que hace que el botón Atrás sea el único medio de navegación. En la Figura 2, se muestra cómo se ve la pantalla Recientes en Android 5.0 y versiones posteriores en comparación con versiones anteriores de la plataforma. La imagen de la pantalla izquierda corresponde a Android 5.0 y versiones posteriores, y en la imagen de la derecha se muestra cómo se ve en versiones anteriores.

Versiones anteriores a Android 5.0 en comparación con vistas más antiguas de la pantalla Recientes

Figura 2: La pantalla Recientes en Android 5.0 y versiones posteriores (izquierda), y en versiones anteriores a Android 5.0 (derecha)

Por lo general, deberías permitir que el sistema defina cómo tus tareas y actividades se representan en la pantalla Recientes y no es necesario que modifiques este comportamiento. Sin embargo, tu app puede determinar cómo y cuándo aparecen las actividades en la pantalla Recientes. La clase ActivityManager.AppTask te permite administrar tareas y las marcas de actividades de la clase Intent te permiten especificar cuándo se agrega o se quita una actividad de la pantalla Recientes. Además, los atributos <activity> te permiten configurar el comportamiento en el manifiesto.

Cómo agregar tareas a la pantalla Recientes.

El uso de las marcas de la clase Intent para agregar una tarea permite tener un mayor control sobre cómo y cuándo se abre o se vuelve a abrir un documento en la pantalla Recientes. Cuando usas los atributos <activity>, puedes seleccionar entre abrir siempre un documento en una nueva tarea o reutilizar una existente.

Cómo usar la marca de intent para agregar una tarea

Cuando creas un nuevo documento para tu actividad, puedes llamar al método startActivity() y pasarlo al intent que inicia la actividad. Si quieres insertar una interrupción lógica a fin de que el sistema trate a tu actividad como una nueva tarea en la pantalla Recientes, pasa la marca FLAG_ACTIVITY_NEW_DOCUMENT en el método addFlags() del Intent que inicia la actividad.

Nota: La marca FLAG_ACTIVITY_NEW_DOCUMENT reemplaza a la marca FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET que dejó de estar disponible a partir de Android 5.0 (API nivel 21).

Si estableces la marca FLAG_ACTIVITY_MULTIPLE_TASK cuando creas un nuevo documento, el sistema siempre creará una nueva tarea con la actividad objetivo como raíz. Esta configuración permite que el mismo documento se abra en varias tareas. En el siguiente código, verás cómo lo hace la actividad principal:

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

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

    }
    

Nota: Las actividades que se inician con la marca FLAG_ACTIVITY_NEW_DOCUMENT deben tener el valor de atributo android:launchMode="standard" (valor predeterminado) establecido en el manifiesto.

Cuando la actividad principal inicia una nueva actividad, el sistema busca entre las tareas existentes una cuyo intent coincida con el nombre del componente del intent y los datos del intent de la actividad. Si no se encuentra la tarea, o si el intent contiene la marca FLAG_ACTIVITY_MULTIPLE_TASK, se creará una nueva con la actividad como su raíz. Si se encuentra una, se trae al primer plano y se pasa el nuevo intent a onNewIntent(). La nueva actividad obtiene el intent y crea un nuevo documento en la pantalla Recientes, como se muestra en este ejemplo:

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

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

Cómo usar el atributo de la actividad para agregar una tarea

Una actividad también puede especificar en su manifiesto que siempre se iniciará en una nueva tarea mediante el atributo <activity>, android:documentLaunchMode. Este atributo tiene cuatro valores que producen los siguientes efectos cuando el usuario abre un documento con la app:

"intoExisting"
La actividad reutiliza una tarea existente para el documento, lo que equivale a configurar la marca FLAG_ACTIVITY_NEW_DOCUMENT sin establecer la marca FLAG_ACTIVITY_MULTIPLE_TASK, como se describe más arriba en Cómo usar la marca del intent para agregar una tarea.
"always"
La actividad crea una nueva tarea para el documento, incluso si este ya está abierto. Usar este valor equivale a configurar las marcas FLAG_ACTIVITY_NEW_DOCUMENT y FLAG_ACTIVITY_MULTIPLE_TASK.
"none"
La actividad no crea una nueva tarea para el documento. La pantalla Recientes trata la actividad como lo haría de manera predeterminada: muestra una sola tarea para la app, que se reanuda desde la última actividad que el usuario invocó.
"never"
La actividad no crea una nueva tarea para el documento. Al configurar este valor, se anula el comportamiento de las marcas FLAG_ACTIVITY_NEW_DOCUMENT y FLAG_ACTIVITY_MULTIPLE_TASK si alguna de estas está configurada en el intent, y en la pantalla Recientes se muestra una sola tarea para la app, que se reanuda desde la última actividad que invocó el usuario.

Nota: En el caso de que los valores sean distintos a none y never, la actividad debe definirse con launchMode="standard". Si no se especifica este atributo, se usa documentLaunchMode="none".

Cómo quitar tareas

De manera predeterminada, la tarea de un documento se quita automáticamente de la pantalla Recientes cuando finaliza la actividad. Puedes anular este comportamiento con la clase ActivityManager.AppTask, con una marca Intent o con un atributo <activity>.

Para excluir completamente una tarea de la pantalla Recientes, configura el atributo <activity> android:excludeFromRecents en true.

Para configurar la cantidad máxima de tareas que tu app puede incluir en la pantalla Recientes, establece el atributo <activity> android:maxRecents en un valor de número entero. El valor predeterminado es 10. Cuando se alcanza la cantidad máxima de tareas, se quita la más antigua de la pantalla Recientes. El valor máximo android:maxRecents es 50 (25 en dispositivos con poca memoria); los valores inferiores a 1 no son válidos.

Cómo usar la clase AppTask para quitar tareas

En la actividad que crea la nueva tarea en la pantalla Recientes, puedes especificar cuándo quitar la tarea y finalizar todas las actividades asociadas con esta mediante un llamado al método finishAndRemoveTask().

Kotlin

    fun onRemoveFromOverview(view: View) {
        // It is good pratice to remove a document from the overview stack if not needed anymore.
        finishAndRemoveTask()
    }
    

Java

NewDocumentActivity.java

    public void onRemoveFromRecents(View view) {
        // The document is no longer needed; remove its task.
        finishAndRemoveTask();
    }
    

Nota: El uso del método finishAndRemoveTask() anula el uso de la etiqueta FLAG_ACTIVITY_RETAIN_IN_RECENTS, que se explica debajo.

Cómo retener las tareas finalizadas

Si quieres retener una tarea en la pantalla Recientes, incluso si la actividad ya finalizó, pasa la marca FLAG_ACTIVITY_RETAIN_IN_RECENTS del método addFlags() del intent que inicia la actividad.

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

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

Para lograr el mismo efecto, configura el atributo <activity> android:autoRemoveFromRecents en false. El valor predeterminado es true para las actividades de documentos y false para las actividades comunes. El uso de este atributo anula la marca FLAG_ACTIVITY_RETAIN_IN_RECENTS, como se explicó anteriormente.

Código de ejemplo adicional

Para descargar una app de ejemplo sobre las apps centradas en documentos, consulta Ejemplo de DocumentCentricRecents y Ejemplo de DocumentCentricRelinquishIdentity de Android.