page.title=Tela de visão geral page.tags="recents","overview" @jd:body
A tela de visão geral (também chamada de tela de recentes, lista de tarefas recentes ou aplicativos recentes) é uma IU de nível de sistema que lista atividades e tarefas acessadas recentemente. O usuário pode navegar pela lista e selecionar uma tarefa a retomar ou remover uma tarefa da lista deslizando-a para fora. Com a versão 5.0 do Android (API de nível 21), várias instâncias da mesma atividade contendo diferentes documentos podem aparecer como tarefas na tela de visão geral. 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 de visão geral.
Figura 1. A tela de visão geral mostrando três documentos do Google Drive, cada um representado como uma tarefa separada.
Normalmente, você deve permitir que o sistema defina como as tarefas e as
atividades são representadas na tela de visão geral e não precisa modificar esse comportamento.
No entanto, o seu aplicativo pode determinar como e quando as atividades aparecem na tela de visão geral. A
classe {@link android.app.ActivityManager.AppTask} permite gerenciar tarefas e os sinalizadores de atividade da classe
{@link android.content.Intent} permitem especificar quando uma atividade é adicionada ou removida da
tela de visão geral. Além disso, os atributos
<activity>
permitem definir o comportamento no manifesto.
Usar os sinalizadores da classe {@link android.content.Intent} para adicionar uma tarefa permite maior controle sobre
quando e como um documento é aberto ou reaberto na tela de visão geral. Ao usar os atributos
<activity>
,
é possível escolher entre sempre abrir o documento em uma nova tarefa ou reutilizar uma
tarefa existente para o documento.
Ao criar um novo documento para a atividade, você chama o método {@link android.app.ActivityManager.AppTask#startActivity(android.content.Context, android.content.Intent, android.os.Bundle) startActivity()} da classe {@link android.app.ActivityManager.AppTask}, passando a ele a intenção que inicia a atividade. Para inserir uma quebra lógica para que o sistema trate a atividade como uma nova tarefa na tela de visão geral, passe o sinalizador {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} no método {@link android.content.Intent#addFlags(int) addFlags()} da {@link android.content.Intent} que inicia a atividade.
Observação: o sinalizador {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} substitui o sinalizador {@link android.content.Intent#FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET}, obsoleto a partir do Android 5.0 (API de nível 21).
Se você usar o sinalizador {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} ao criar o novo documento, o sistema sempre criará uma nova tarefa com a atividade-alvo como raiz. Essa configuração permite que o mesmo documento seja aberto em mais de uma tarefa. O código a seguir demonstra como a atividade principal faz isso:
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 = mCheckbox.isChecked(); final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class); newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet()); return newDocumentIntent; } private static int incrementAndGet() { Log.d(TAG, "incrementAndGet(): " + mDocumentCounter); return mDocumentCounter++; } }
Observação: Atividades iniciadas com o sinalizador {@code FLAG_ACTIVITY_NEW_DOCUMENT} devem ter o valor do atributo {@code android:launchMode="standard"} (o padrão) definido no manifesto.
Quando a atividade principal inicia uma nova atividade, o sistema procura nas tarefas existentes uma cuja intenção corresponda ao nome do componente da intenção e aos dados de Intent para a atividade. Se a tarefa não for encontrada ou se a intenção continha o sinalizador {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}, uma nova tarefa será criada com a atividade como raiz. Se o sistema encontrar uma tarefa, ele a trará para a frente e passará a nova intenção para {@link android.app.Activity#onNewIntent onNewIntent()}. A nova atividade receberá a intenção e criará um novo documento na tela de visão geral, como no exemplo a seguir:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_new_document); mDocumentCount = getIntent() .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0); mDocumentCounterTextView = (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); }
Uma atividade também pode especificar em seu manifesto que sempre iniciará uma nova tarefa usando
o atributo <activity>
,
{@code android:documentLaunchMode}. Esse atributo tem quatro valores que produzem os seguintes
efeitos quando o usuário abre um documento com o aplicativo:
Observação: para valores diferentes de {@code none} e {@code never}, a atividade deve ser definida com {@code launchMode="standard"}. Se esse atributo não for especificado, {@code documentLaunchMode="none"} será usado.
Por padrão, uma tarefa de documento é automaticamente removida da tela de visão geral quando a atividade
termina. Esse comportamento pode ser substituído com a classe {@link android.app.ActivityManager.AppTask},
com um sinalizador {@link android.content.Intent} ou com um atributo
<activity>
.
É possível excluir inteiramente uma tarefa da tela de visão geral definindo o
atributo <activity>
,
{@code android:excludeFromRecents} como {@code true}.
É possível definir o número máximo de tarefas que o aplicativo pode incluir na tela de visão geral definindo
o atributo <activity>
{@code android:maxRecents}
como um valor inteiro. O padrão é 16. Quando o número máximo de tarefas é atingido, a tarefa usada menos
recentemente é removida da tela de visão geral. O valor máximo de {@code android:maxRecents}
é 50 (25 em dispositivos com pouca memória); valores menores que 1 não são válidos.
Na atividade que cria uma nova tarefa na tela de visão geral, é possível especificar quando remover a tarefa e terminar todas as atividades associadas a ela chamando o método {@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()}.
public void onRemoveFromRecents(View view) { // The document is no longer needed; remove its task. finishAndRemoveTask(); }
Observação: o uso do método {@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()} substitui o uso do sinalizador {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} discutido abaixo.
Se você deseja reter uma tarefa na tela de visão geral, mesmo que a atividade tenha terminado, passe o sinalizador {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} no método {@link android.content.Intent#addFlags(int) addFlags()} da Intent que inicia a atividade.
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, incrementAndGet()); return newDocumentIntent; }
Para obter o mesmo efeito, defina o
atributo <activity>
{@code android:autoRemoveFromRecents} como {@code false}. O valor padrão é {@code true}
para atividades de documentos e {@code false} para atividades comuns. Usar esse atributo substitui
o sinalizador {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} discutido anteriormente.