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:
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:
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 flagFLAG_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
eFLAG_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
eFLAG_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.
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")); } }