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