Problema no pedido da pilha de atividades ao iniciar o aplicativo no instalador de aplicativos Android e na tela inicial
Apenas para fins de teste, estou permitindo que o APK do aplicativo seja baixado e instalado por meio de um URL. Depois de baixado no telefone, ele pode ser iniciado com o instalador do aplicativo Android, que oferece ao usuário a opção de instalá-lo no dispositivo e executá-lo.
Considere se tivermos baixado e executado o aplicativo da maneira descrita acima. A atividade principal / iniciante no meu aplicativo é uma página de login Activity A
). Depois que o usuário é autenticado, ele é levado para a área principal do aplicativo, por exemploActivity B
. Então agora a pilha de atividades atual desta tarefa éA > B
.
Em seguida, pressiono o botão inicial no telefone e sou levado para a tela inicial do Android. Reinicio meu aplicativo por meio do ícone no menu e sou levado paraActivity A
, ao invés deActivity B
. A pilha de atividades agora éA > B > A
, ou agora existem duas tarefas separadas com pilhas de atividadesA > B
eA
respectivamente. O que eu quero é ser levado de volta paraActivity B
quando reiniciar o aplicativo. Pressionar para trás enquanto estiver nesse estado me levará de volta paraActivity B
.
Este comportamento indesejado só acontece se eu abrir o aplicativo pela primeira vez pelo instalador, e não se eu abrir o aplicativo pela tela inicial / men
Examinei como as atividades estão sendo iniciadas por cada mecanismo. Quando usamos o instalador do aplicativo, vemos os seguintes logs:
INFO/ActivityManager(XXXX): Starting activity: Intent { dat=file:///mnt/sdcard/download/[my app].apk cmp=com.android.packageinstaller/.InstallAppProgress (has extras) }
INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=[my package]/[Activity A] }
via launcher / tela inicial:
INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=[my package]/[Activity A] }
Quando iniciado com o instalador, vemos que ele está usando a bandeira0x10000000
, mas quando iniciado com o iniciador, vemos que ele está usando0x10200000
. Também está usando uma categoria de intenção.
De docs vemos as bandeiras são:
public static final int FLAG_ACTIVITY_NEW_TASK
Constant Value: 268435456 (0x10000000)
public static final int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
Constant Value: 2097152 (0x00200000)
A bandeiraFLAG_ACTIVITY_RESET_TASK_IF_NEEDED
(que está sendo usado quando o aplicativo é iniciado a partir do iniciador) normalmente evita que uma nova tarefa seja criada, se já existe, e restaura a última atividade usada. Esse é o comportamento desejado. Por que não está funcionando nessa situação? Há algo que eu possa fazer para garantir que meu aplicativo sempre retorne à última Atividade, independentemente de ter sido iniciada pelo instalador / iniciador de aplicativos?
Se eu usarsingleTask
sempre me levará de volta à atividade principal Activity A
) sempre que executo o aplicativo (o que também não é desejável
Aqui está uma pergunta que encontrei onde alguém está enfrentando um problema semelhante (que não tem resposta aceita): @App perde a capacidade de lembrar sua pilha quando iniciado a partir de outro aplicativ
EDIT: Verificando a bandeiraFLAG_ACTIVITY_BROUGHT_TO_FRONT
emonCreate()
da nossa atividade do iniciador (e, em seguida, finalizando se estiver definido) parece corrigir o sintoma principal, mas claramente o problema subjacente ainda está lá. Existe uma correção mais completa?
EDIT2: o mesmo resultado ocorre quando você baixa / executa o aplicativo no Android Market, portanto, alguns dos detalhes acima podem não ser relevante