Como trazer uma atividade para o primeiro plano (topo da pilha)?
-
19-09-2019 - |
Pergunta
No Android, eu defini um exame de atividade.
Quando meu aplicativo foi lançado, uma instância dessa atividade A foi criada, digamos que é A
. Quando o usuário clicou em um botão em A
, outra instância de atividade B, B foi criada. Agora, a pilha de tarefas é BA, com B no topo. Em seguida, o usuário clicou em um botão em B, outra instância de ativividade C e C foi criada. Agora, a pilha de tarefas é CBA, com C na parte superior.
Agora, quando o usuário clica em um botão em C, quero que o aplicativo traga um primeiro plano, ou seja, faça um para estar na parte superior da pilha de tarefas, ACB.
Como posso escrever o código para que isso aconteça?
Solução
Você pode tentar isso FLAG_ACTIVITY_REORDER_TO_FRONT
(O documento descreve exatamente o que você deseja)
Outras dicas
A melhor maneira de fazer isso foi usar a mesma intenção que a tela inicial do Android usa - o lançador de aplicativos.
Por exemplo:
Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);
Dessa forma, qualquer atividade da minha embalagem foi usada mais recentemente pelo usuário é trazida de volta à frente novamente. Achei isso útil no uso do meu serviço PendingIntent para levar o usuário de volta ao meu aplicativo.
Aqui está um exemplo de código de como você pode fazer isso:
Intent intent = getIntent(getApplicationContext(), A.class)
Isso garantirá que você tenha apenas uma instância de uma atividade na pilha.
private static Intent getIntent(Context context, Class<?> cls) {
Intent intent = new Intent(context, cls);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
return intent;
}
Flag_activity_reorder_to_front: Se definido em uma intenção passada para o context.StartActivity (), esse sinalizador fará com que a atividade lançada seja levada para a frente da pilha de história de sua tarefa, se já estiver em execução.
Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);
Eu acho que uma combinação de Intent
As bandeiras devem fazer o truque. Em particular, Intent.FLAG_ACTIVITY_CLEAR_TOP
e Intent.FLAG_ACTIVITY_NEW_TASK
.
Adicione essas bandeiras à sua intenção antes de ligar startActvity
.
i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
Observe que o seu lançamento de homeatividade deve ser único
Em geral, acho que esse método de gerenciamento de atividades não é recomendado. O problema de reativar uma atividade duas etapas na pilha é que essa atividade provavelmente foi morta. Meu conselho lembre -se do estado de suas atividades e lançá -las com startActivity ()
Tenho certeza que você viu esta página, mas para Sua conveniência este link
Se você deseja trazer uma atividade para o topo da pilha ao clicar em uma notificação, pode ser necessário fazer o seguinte para fazer com que o FLAG_ACTIVIDE_REORDER_TO_FRONT funcione:
A solução para mim para isso foi fazer um receptor de transmissão que escuta as ações de transmissão que a notificação gabia. Então, basicamente:
A notificação desencadeia uma ação de transmissão com um nome extra da atividade a ser lançada.
O receptor de transmissão pega isso quando a notificação é clicada, depois cria uma intenção de iniciar essa atividade usando o sinalizador FLAG_ACTIVIDADE_REODERS_TO_FRONT
A atividade é levada ao topo da pilha de atividades, sem duplicatas.
Se você estiver usando a "mensagem do Google Cloud" para receber notificações push com a classe "PendingIntent", o código a seguir exibe a notificação apenas na barra de ação.
Ao clicar na notificação, nenhuma atividade será criada, a última atividade ativa é restaurada retenção do estado atual sem problemas.
Intent notificationIntent = new Intent(this, ActBase.class);
**notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);**
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("Localtaxi")
.setVibrate(vibrate)
.setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
.setAutoCancel(true)
.setOnlyAlertOnce(true)
.setContentText(msg);
mBuilder.setContentIntent(contentIntent);
NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
Tchau!