Meu aplicativo tem notificações, que - obviamente - sem sinalizadores, iniciam uma nova atividade toda vez, para que eu receba várias mesmas atividades sendo executadas umas sobre as outras, o que está errado.
O que eu quero fazer é trazer a atividade especificada nas notificações com intenção pendente para a frente, se já estiver em execução, caso contrário, inicie-a.
Até agora, a intenção / intenção pendente para essa notificação que tenho é
private static PendingIntent prepareIntent(Context context) {
Intent intent = new Intent(context, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
e estranhamente, às vezes funciona, às vezes não ... Sinto que já tentei todas as combinações de sinalizadores.
onNewIntent
e definir sinalizadores)Eu acho que a melhor maneira de fazê-lo e de uma maneira simples é iniciar a atividade normalmente, mas definir essa atividade no manifesto com a
singleInstance
propriedade Com isso, você praticamente aborda os dois problemas que está enfrentando no momento, trazendo a atividade para a frente o tempo todo e permitindo que o sistema operacional crie automaticamente uma nova, se não houver atividade, ou traga para a frente a atividade existente no momento (graças aosingleInstance
propriedade).É assim que uma atividade é declarada como uma única instância:
Além disso, para evitar uma animação instável ao iniciar o singleInstance, você pode usar o "singleTask", ambos são muito semelhantes, mas a diferença é explicada aqui conforme a documentação do Google:
Espero que isto ajude.
Saudações!
fonte
Eu acho que o que você precisa está dentro
singleTop
Activity
, em vez de umsingleTask
ousingleInstance
.O que a documentação diz atende perfeitamente às suas necessidades:
Além disso (sem trocadilhos), eu tinha exatamente a mesma necessidade que você. Testei todos os
launchMode
sinalizadores para descobrir como eles realmente se comportam na prática e, como resultado,singleTop
é realmente o melhor para isso: nenhuma animação estranha, aplicativo exibido uma vez na lista de aplicativos recentes (ao contrário dosingleInstance
que é exibido duas vezes devido ao fato de que não ' permitir que qualquer outro façaActivity
parte de sua tarefa) e se comportar adequadamente, independentemente de o alvoActivity
já existir ou não.fonte
Este é um tópico antigo, mas para todos aqueles que ainda procuram respostas, aqui está a minha solução. É puramente no código, sem configurações de manifesto:
Aqui, FLAG_ACTIVITY_SINGLE_TOP abre a atividade existente se ela estiver no topo da pilha de tarefas. Se não estiver no topo, mas dentro da pilha, FLAG_ACTIVITY_CLEAR_TOP removerá todas as atividades no topo da atividade de destino e a exibirá. Se a atividade não estiver na pilha de tarefas, uma nova será criada. Um ponto crucialmente importante a ser mencionado - o segundo parâmetro de PendingIntent.getActivity (), ou seja, requestCode deve ter um valor diferente de zero (eu até chamei de NON_ZERO_REQUEST_CODE no meu snippet), caso contrário, esses sinalizadores de intenção não funcionarão. Eu não tenho idéia do por que é como é. O sinalizador FLAG_ACTIVITY_SINGLE_TOP é intercambiável com o android: launchMode = "singleTop" na tag de atividade no manifesto.
fonte
Eu sei que é antigo, mas nada acima foi adequado ao meu aplicativo.
Sem alterar manifestos e outras configurações, eis o código para trazer seu aplicativo de volta à frente - ou abri-lo quando estiver fechado
fonte
Eu tentei isso e funcionou mesmo que o IDE estivesse reclamando do código
fonte
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
não é um sinalizador válido paraPendingINtent.getActivity
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
não é um sinalizador válido quando usado como umPendingIntent
. Ou talvez você quis dizer que não é válido passar para ogetActivity
método, mas é válido para usar comoIntent
sinalizador que é usado como umPendingIntent
?Como você diz que deseja iniciar sua atividade se ela ainda não foi iniciada, talvez você não se importe em reiniciá-la. Também testei uma tonelada de sugestões e combinações de sinalizadores para a intenção, isso sempre trará a atividade que você precisa para a frente, embora não mantenha nenhum estado anteriormente associado a ela.
Somente API11 +.
fonte
Eu tive um problema semelhante depois de adicionar as notificações encontradas no site de treinamento do Android . Nenhuma das outras respostas aqui funcionou para mim, no entanto, essa resposta funcionou para mim. Resumo:
fonte