Telas recentes

A tela "Recentes", também chamada de tela "Visão geral", lista de tarefas recentes ou tela de apps recentes, é uma IU no nível do sistema que lista atividades e tarefas acessadas recentemente. O usuário pode navegar pela lista, selecionar uma tarefa para retomar ou remover uma tarefa da lista deslizando-a para fora.

A tela Recentes usa um modelo centrado em documentos, lançado no Android 5.0 (nível 21 da API), em que várias instâncias da mesma atividade contendo documentos diferentes podem aparecer como tarefas na tela Recentes. Por exemplo, o Google Drive pode ter uma tarefa para cada um dos vários documentos do Google. Cada documento aparece como uma tarefa na tela Recentes:

Tela "Recentes" mostrando dois documentos do Google Drive, cada um representado como uma tarefa separada.

Outro exemplo comum é quando o usuário está usando o navegador e toca em Compartilhar > Gmail. A tela Escrever do app Gmail aparece. Tocar no botão "Recentes" nesse momento revela o Chrome e o Gmail em execução como tarefas separadas:

A tela "Recentes" mostrando o Chrome e o Gmail sendo executados como tarefas separadas.

Normalmente, você permite que o sistema defina como suas tarefas e atividades são representadas na tela Recentes. Não é necessário modificar esse comportamento. No entanto, seu app pode determinar como e quando as atividades aparecem na tela Recentes.

A classe ActivityManager.AppTask permite gerenciar tarefas, e as flags de atividade da classe Intent permitem especificar quando uma atividade é adicionada ou removida da tela Recentes. Além disso, os atributos <activity> permitem definir o comportamento no manifesto.

Adicionar tarefas à tela Recentes

O uso das sinalizações da classe Intent para adicionar uma tarefa oferece maior controle sobre quando e como um documento é aberto ou reaberto na tela Recentes. Ao usar os atributos <activity>, você pode escolher entre sempre abrir o documento em uma nova tarefa ou reutilizar uma tarefa existente.

Usar a sinalização de intent para adicionar uma tarefa

Ao criar um novo documento para sua atividade, você chama o método startActivity(), transmitindo a ele a intent que inicia a atividade. Para inserir uma quebra lógica para que o sistema trate sua atividade como uma nova tarefa na tela Recentes, transmita a flag FLAG_ACTIVITY_NEW_DOCUMENT no método addFlags() da Intent que inicia a atividade.

Se você definir a sinalização FLAG_ACTIVITY_MULTIPLE_TASK ao criar o novo documento, o sistema sempre vai criar uma nova tarefa com a atividade de destino como raiz. Essa configuração permite que o mesmo documento seja aberto em mais de uma tarefa. O código abaixo demonstra como a atividade principal faz isso:

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 a atividade principal inicia uma nova atividade, o sistema procura nas tarefas existentes uma com intent que corresponda ao nome do componente da intent e aos dados da intent. Se a tarefa não for encontrada ou a intent contiver a sinalização FLAG_ACTIVITY_MULTIPLE_TASK, uma nova tarefa será criada com a atividade como raiz.

Se o sistema encontrar uma tarefa com uma intent que corresponda ao nome do componente da intent e aos dados da intent, ele levará essa tarefa para frente e a transmitirá para onNewIntent(). A nova atividade recebe a intent e cria um novo documento na tela Recentes, conforme mostrado no exemplo abaixo:

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

Usar o atributo de atividade para adicionar uma tarefa

Uma atividade também pode especificar no manifesto que ela sempre é iniciada em uma nova tarefa usando o atributo <activity> android:documentLaunchMode. Esse atributo tem quatro valores que produzem os efeitos abaixo quando o usuário abre um documento com o aplicativo:

intoExisting
A atividade reutiliza uma tarefa existente para o documento. Isso é o mesmo que definir a sinalização FLAG_ACTIVITY_NEW_DOCUMENT sem configurar a flag FLAG_ACTIVITY_MULTIPLE_TASK, conforme descrito na seção Como usar a sinalização de intent para adicionar uma tarefa.
always
A atividade cria uma nova tarefa para o documento, mesmo que ele já esteja aberto. Usar esse valor é o mesmo que configurar as flags FLAG_ACTIVITY_NEW_DOCUMENT e FLAG_ACTIVITY_MULTIPLE_TASK.
none
A atividade não cria uma nova tarefa para o documento. A tela Recentes trata a atividade como faria por padrão. Ele exibe uma única tarefa para o app, que é retomada de qualquer atividade que o usuário invocou pela última vez.
never
A atividade não cria uma nova tarefa para o documento. Definir esse valor substitui o comportamento das sinalizações FLAG_ACTIVITY_NEW_DOCUMENT e FLAG_ACTIVITY_MULTIPLE_TASK. Se uma delas for definida na intent e a tela Recentes exibir uma única tarefa para o app, ela será retomada a partir da atividade invocada mais recentemente pelo usuário.

Remover tarefas

Por padrão, uma tarefa de documento sai automaticamente da tela Recentes quando a atividade é concluída. É possível substituir esse comportamento com a classe ActivityManager.AppTask, com uma flag Intent ou um atributo <activity>.

Você pode excluir uma tarefa totalmente da tela "Recentes" a qualquer momento definindo o atributo <activity> android:excludeFromRecents como true.

Você pode definir o número máximo de tarefas que o app pode incluir na tela Recentes definindo o atributo <activity> android:maxRecents como um valor inteiro. Quando o número máximo de tarefas é atingido, a tarefa usada menos recentemente desaparece da tela Recentes. O padrão é 16, e o valor máximo é 50 (25 em dispositivos com pouca memória). Valores menores que 1 não são válidos.

Usar a classe AppTask para remover tarefas

Na atividade que cria uma nova tarefa na tela Recentes, você pode especificar quando remover a tarefa e concluir todas as atividades associadas a ela chamando o 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

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

Reter tarefas concluídas

Se você quiser manter uma tarefa na tela Recentes, mesmo que a atividade tenha sido concluída, transmita a flag FLAG_ACTIVITY_RETAIN_IN_RECENTS no método addFlags() da intent que inicia a atividade.

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

Para ter o mesmo efeito, defina o atributo <activity> android:autoRemoveFromRecents como false. O valor padrão é true para atividades de documentos e false para atividades regulares. O uso desse atributo modifica a flag FLAG_ACTIVITY_RETAIN_IN_RECENTS.

Ativar o compartilhamento de URLs recentes (somente no Pixel)

Em dispositivos Pixel com o Android 12 ou versões mais recentes, os usuários podem compartilhar links para conteúdos da Web acessados recentemente diretamente na tela "Recentes". Depois de acessar o conteúdo em um app, o usuário pode deslizar até a tela "Recentes", encontrar o app em que viu o conteúdo e tocar no botão do link para copiar ou compartilhar o URL.

Tela "Recentes" com um link para compartilhar conteúdo da Web acessado recentemente.

Qualquer app pode ativar a vinculação de Recentes para os usuários fornecendo uma IU da Web e substituindo onProvideAssistContent(), conforme mostrado no exemplo a seguir:

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