Encontrei um bug no meu aplicativo quando ele foi iniciado usando o botão "Abrir" no aplicativo Google Play Store (anteriormente chamado Android Market). Parece que iniciá-lo na Play Store usa um modo diferente do Intent
que iniciá-lo no menu de ícones do aplicativo do telefone. Isso leva ao lançamento de várias cópias da mesma atividade, que estão em conflito entre si.
Por exemplo, se meu aplicativo consistir nas Atividades ABC, esse problema poderá levar a uma pilha de ABCA.
Tentei usar android:launchMode="singleTask"
todas as atividades para corrigir esse problema, mas ele tem o efeito colateral indesejado de limpar a pilha de atividades para fazer root, sempre que clico no botão HOME.
O comportamento esperado é: ABC -> HOME -> E quando o aplicativo é restaurado, preciso: ABC -> HOME -> ABC
Existe uma boa maneira de impedir o lançamento de várias atividades do mesmo tipo, sem redefinir a atividade raiz ao usar o botão HOME?
fonte
Respostas:
Adicione isso ao onCreate e você deve começar:
fonte
finish()
, o usuário verá a atividade que estava por baixo. Por isso, você pode assumir com segurança que a instância existente do aplicativo será trazida para o primeiro plano. Se não fosse esse o caso, você teria várias instâncias do aplicativo em tarefas separadas e a atividade criada seria a raiz de sua tarefa.Vou apenas explicar por que ele falha e como reproduzir esse bug programaticamente para que você possa incorporar isso ao seu conjunto de testes:
Quando você inicia um aplicativo por meio do Eclipse ou do Market App, ele é iniciado com sinalizadores de intenção: FLAG_ACTIVITY_NEW_TASK.
Ao iniciar pelo iniciador (home), ele usa sinalizadores: FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_BROUGHT_TO_FRONT | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED e usa a ação " MAIN " e a categoria " LAUNCHER ".
Se você deseja reproduzir isso em um caso de teste, siga estas etapas:
Em seguida, faça o que for necessário para chegar à outra atividade. Para meus propósitos, acabei de colocar um botão que inicia outra atividade. Em seguida, volte ao iniciador (casa) com:
E simule o lançamento através do iniciador com este:
Se você não incorporou a solução alternativa isTaskRoot (), isso reproduzirá o problema. Usamos isso em nossos testes automáticos para garantir que esse bug nunca ocorra novamente.
Espero que isto ajude!
fonte
Você já experimentou o modo de inicialização singleTop ?
Aqui estão algumas das descrições em http://developer.android.com/guide/topics/manifest/activity-element.html :
fonte
Talvez seja esse problema ? Ou alguma outra forma do mesmo bug?
fonte
Eu acho que a resposta aceita ( Duane Homick ) tem casos não tratados :
Você tem extras diferentes (e o aplicativo duplicou como resultado):
Aqui está uma solução (SDK_INT> = 11 para notificações) que eu acredito lidar com esses casos e notificações da barra de status também.
Manifesto :
Atividade do iniciador :
Serviço :
Notificação :
fonte
Percebo que a pergunta não tem nada a ver com o Xamarin Android, mas eu queria postar algo, já que não o vi em nenhum outro lugar.
Para corrigir isso no Xamarin Android, usei o código de @DuaneHomick e o adicionei
MainActivity.OnCreate()
. A diferença com o Xamarin é que é preciso ir atrásXamarin.Forms.Forms.Init(this, bundle);
eLoadApplication(new App());
. Então, minhaOnCreate()
aparência seria:* Editar: Desde o Android 6.0, a solução acima não é suficiente para determinadas situações. Agora também defini
LaunchMode
comoSingleTask
, o que parece ter feito as coisas funcionarem corretamente mais uma vez. Não tenho certeza de que efeitos isso pode ter em outras coisas, embora infelizmente.fonte
Eu também tive esse problema
android:configChanges="mcc|mnc"
- se você tem conexão com celular, consulte http://developer.android.com/guide/topics/manifest/activity-element.html#config para qual configuração existe ao inicializar o sistema ou empurrar para abrir ou o que for.fonte
Tente esta solução:
Crie uma
Application
classe e defina lá:Em seguida, na sua primeira atividade (iniciador)
onCreate
antes desetContentView(...)
adicionar este:PS
Controller
é minhaApplication
classe.fonte
IS_APP_RUNNING
serátrue
e seu aplicativo será encerrado imediatamente. Não é algo que o usuário possa achar divertido.Eu tive o mesmo problema e o corrigi usando a seguinte solução.
Na sua atividade principal, adicione este código na parte superior do
onCreate
método:não esqueça de adicionar essa permissão no seu manifesto.
espero que ajude você.
fonte
tente usar o modo de inicialização SingleInstance com afinidade definida como allowtaskreparenting Isso sempre criará a atividade em uma nova tarefa, mas também permitirá sua reparação. Marque dis: atributo Affinity
fonte
Eu encontrei uma maneira de impedir o início das mesmas atividades, isso funciona muito bem para mim
fonte