Telas recentes

A tela "Recentes", também chamada de "Visão geral", "Lista de apps recentes", ou tela de apps recentes, é uma interface do sistema que lista os apps acessados recentemente atividades e tarefas. 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 uma ferramenta model, introduzido no Android 5.0 (API nível 21), em que várias instâncias de a mesma atividade que contém documentos diferentes podem aparecer como tarefas no Tela "Recentes". Por exemplo, o Google Drive pode ter uma tarefa para cada um em vários documentos do Google. Cada documento aparece como uma tarefa na seção "Recentes" tela:

A tela "Recentes" mostrando duas imagens do Google Drive documentos, cada um representado como uma tarefa separada.

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

A tela "Recentes" mostrando o Chrome e o Gmail em execução como tarefas separadas.

Normalmente, você deixa o sistema definir como suas tarefas e atividades são representada na tela "Recentes". Não é necessário modificar isso do seu modelo. No entanto, seu app pode determinar como e quando as atividades aparecem na Tela "Recentes".

A ActivityManager.AppTask permite que você gerencie tarefas, e as sinalizações de atividade da Intent permite especificar quando uma atividade seja adicionada ou removida da tela Recentes. Além disso, Os atributos <activity> permitem que você defina o comportamento no manifesto.

Adicionar tarefas à tela "Recentes"

Use as sinalizações da classe Intent para adicionar uma tarefa oferece mais controle sobre quando e como um documento é aberto ou reaberta na tela "Recentes". Quando você usa o <activity>, é possível escolher entre sempre abrir o documento em uma nova tarefa ou reutilizar uma existente tarefa para o documento.

Usar a flag de intent para adicionar uma tarefa

Quando você cria um novo documento para sua atividade, você chama o método startActivity() , passando a ele a intent que inicia a atividade. Para inserir uma lógica para que o sistema trate sua atividade como uma nova tarefa na seção da tela, passe o valor FLAG_ACTIVITY_NEW_DOCUMENT no addFlags() do Intent que inicia a atividades.

Se você definir o FLAG_ACTIVITY_MULTIPLE_TASK quando você cria o novo documento, o sistema sempre cria uma nova tarefa com a atividade de destino como raiz. Essa configuração permite que o mesmo documento seja aberta em mais de uma tarefa. O código a seguir demonstra como atividade faz isto:

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 pesquisa tarefas existentes para uma cuja intent corresponda ao nome do componente da intent e ao dados de intent para a atividade. Se a tarefa não for encontrada ou se a intent FLAG_ACTIVITY_MULTIPLE_TASK , uma nova tarefa é criada com a atividade como raiz.

Se o sistema encontrar uma tarefa cuja intent corresponda ao nome do componente da intent e os dados da intent, ele traz essa tarefa para o primeiro plano e transmite a nova intent onNewIntent() A nova atividade recebe a intent e cria um novo documento na pasta na tela, conforme mostrado neste exemplo:

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 sempre será iniciada em uma nova tarefa usando o <activity> atributo android:documentLaunchMode. Esse atributo tem quatro valores, que produzem os seguintes efeitos quando o usuário abre um documento com o aplicativo:

intoExisting
A atividade reutiliza uma tarefa existente para o documento. Isso é o mesmo que configurar FLAG_ACTIVITY_NEW_DOCUMENT sem definir FLAG_ACTIVITY_MULTIPLE_TASK conforme descrito na Como usar a flag de intent para adicionar uma seção de tarefa.
always
A atividade cria uma nova tarefa para o documento, mesmo que ele seja já está aberto. Usar esse valor é o mesmo que configurar as duas Sinalizações FLAG_ACTIVITY_NEW_DOCUMENT e FLAG_ACTIVITY_MULTIPLE_TASK.
none
A atividade não cria uma nova tarefa para o documento. Recentes tela tratará a atividade como faria por padrão. Ele mostra uma única tarefa para o app, que é retomado 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 da FLAG_ACTIVITY_NEW_DOCUMENT e FLAG_ACTIVITY_MULTIPLE_TASK de status. Se uma delas estiver definida na intent, e a tela "Recentes" exibe uma única tarefa para o aplicativo, ele retoma qualquer atividade ao pelo último usuário invocado.
.

Remover tarefas

Por padrão, uma tarefa do documento é encerrada automaticamente da tela Recentes quando a atividade terminar. Você pode substituir esse comportamento com o ActivityManager.AppTask com uma sinalização Intent ou com um atributo <activity>.

Você pode excluir uma tarefa da tela "Recentes" por completo configurando o atributo <activity> android:excludeFromRecents para true.

É possível definir o número máximo de tarefas que seu app pode incluir no "Recentes", definindo o Atributo <activity> android:maxRecents a um 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 de 1 não são válidas.

Usar a classe AppTask para remover tarefas

Na atividade que cria uma nova tarefa na tela "Recentes", é possível especificar quando remover a tarefa e finalizar todas as atividades associadas a ela chamando 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 dela tenha terminar, passe o FLAG_ACTIVITY_RETAIN_IN_RECENTS na Método addFlags() da 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 conseguir o mesmo efeito, defina o Atributo <activity> android:autoRemoveFromRecents para false. O valor padrão é true para atividades de documentos e false para em atividades regulares. O uso desse atributo substitui sinalização 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 o conteúdo da Web visualizado recentemente diretamente da tela "Recentes". Após visitar conteúdo em um app, o usuário pode deslizar até a tela "Recentes" e encontrar o app onde visualizaram o conteúdo e, em seguida, tocar no botão do link para copiar ou compartilhar o URL.

A tela "Recentes" com um link para compartilhar acesso recente ao conteúdo da Web.

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

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