Como trazer uma atividade para o primeiro plano (topo da pilha)?

90

No Android, defini uma atividade ExampleActivity.

Quando meu aplicativo foi iniciado, uma instância dessa A-Activity foi criada, digamos que sim A. Quando o usuário clicou em um botão A, outra instância de B-Activity, 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 C-Activity e C foi criada. Agora, a pilha de tarefas é CBA, com C no topo.

Agora, quando o usuário clica em um botão em C, quero que o aplicativo traga A para o primeiro plano, ou seja, faça com que A esteja no topo da pilha de tarefas, ACB.

Como posso escrever o código para que isso aconteça?

user256239
fonte

Respostas:

108

Você pode tentar isso FLAG_ACTIVITY_REORDER_TO_FRONT(o documento descreve exatamente o que você deseja)

Reno
fonte
3
Acho que deveria ser FLAG_ACTIVITY_SINGLE_TOP .
26
@ user942821 FLAG_ACTIVITY_SINGLE_TOPnão ajudará aqui. Quando ActivityC está no topo da pilha e chama startActivity()para iniciar ActivityA, mesmo que você defina FLAG_ACTIVITY_SINGLE_TOP, ainda criará uma nova instância de ActivityA. FLAG_ACTIVITY_SINGLE_TOPimpede apenas a criação de uma nova instância se você estiver tentando iniciar uma atividade que já está no topo da pilha . Nesse caso, ActivityA não está no topo da pilha, então o Android cria uma nova instância.
David Wasser
6
Impressionante! Usado (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)para limpar qualquer histórico após um dado Activity.
shkschneider
10
FLAG_ACTIVITY_REORDER_TO_FRONT será ignorado se você especificar FLAG_ACTIVITY_CLEAR_TOP também. Verifique a documentação.
Kris Subramanian
3
intent.addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); Isso funcionará bem se você quiser trazer sua atividade para a frente com a sessão do usuário se ela já estiver no topo da pilha de costas, mas não na frente.
Hassan Jamil
64

A melhor maneira que descobri de fazer isso foi usar a mesma intenção que a tela inicial do Android usa - o inicializador 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 em meu pacote que foi usada mais recentemente pelo usuário é trazida de volta para a frente novamente. Achei isso útil ao usar o PendingIntent do meu serviço para levar o usuário de volta ao meu aplicativo.

greg7gkb
fonte
2
Muito obrigado por esse pedaço de código. Perdi horas tentando fazer isso funcionar corretamente.
PakitoV
3
ou sem ComponentName e setComponent, mas com novo Intent (this, MyMainActivity.class)
Tima
3
Estranho como essa foi a única coisa que funcionou para mim; definir sinalizadores não funcionava e sempre recriava a atividade.
Steven Huang,
5
Quando leio esta resposta e os comentários, fica claro que temos um mal-entendido. A questão original é como reorganizar um Activitydentro da pilha de tarefas. OP afirma claramente que deseja mover-se ActivityAda parte inferior da pilha para o topo da pilha (ou seja: ele deseja reordenar a ActivityA para a frente da pilha de tarefas ). Esta resposta não fará isso. Esta resposta é uma resposta à pergunta "Como posso trazer meu aplicativo (pilha de tarefas) do segundo plano para o primeiro plano?" Essa é uma pergunta completamente diferente da pergunta original de OP.
David Wasser
3
Também o botão de voto positivo diz "Esta resposta é útil" e não "esta resposta é útil para o op" - ele / ela já tem "marca de aceitação" para esta situação. Obviamente, eu não sei o que é útil para a operação, e as respostas de downvoting IMHO baseadas em minhas suposições sobre o que é útil para a operação estão incorretas.
Boris Treukhov
28

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;
}
Jan-Terje Sørensen
fonte
11

FLAG_ACTIVITY_REORDER_TO_FRONT : Se definido em um Intent passado para Context.startActivity (), este sinalizador fará com que a atividade iniciada seja trazida para a frente da pilha de histórico 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);
FunGapApp
fonte
4

Acho que uma combinação de Intentsinalizadores deve resolver. Em particular, Intent.FLAG_ACTIVITY_CLEAR_TOPe Intent.FLAG_ACTIVITY_NEW_TASK.

Adicione essas sinalizações à sua intent antes de chamar startActvity.

Al.
fonte
2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

Nota Seu modo de inicialização de atividade inicial deve ser single_task

Sujith s
fonte
1

Em geral, acho que esse método de gerenciamento de atividades não é recomendado. O problema em reativar uma atividade duas etapas abaixo na pilha é que essa atividade provavelmente foi eliminada. Meu conselho é lembrar o estado de suas atividades e iniciá-las comstartActivity ()

Tenho certeza que você já viu esta página, mas para sua conveniência este link

Segfault
fonte
0

Se você deseja colocar uma atividade no topo da pilha ao clicar em uma Notificação, pode ser necessário fazer o seguinte para que FLAG_ACTIVITY_REORDER_TO_FRONT funcione:

A solução para isso foi fazer um receptor de transmissão que escuta as ações de transmissão que a notificação aciona. Então, basicamente:

  1. A notificação aciona uma ação de transmissão com um nome extra da atividade a ser iniciada.

  2. O receptor de transmissão detecta isso quando a notificação é clicada e, em seguida, cria uma intenção de iniciar essa atividade usando a sinalização FLAG_ACTIVITY_REORDER_TO_FRONT

  3. A atividade é colocada no topo da pilha de atividades, sem duplicatas.

Sakis Kaliakoudas
fonte
-2

se você estiver usando o "Google Cloud Message" para receber notificações push com a classe "PendingIntent", o código a seguir exibirá a notificação apenas na barra de ação.

Clicando na notificação nenhuma atividade será criada, a última atividade ativa é restaurada mantendo o 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!

GFPF
fonte