Android - startActivityForResult acionando imediatamente o onActivityResult

144

Estou iniciando atividades da atividade principal do meu aplicativo usando a chamada startActivityForResult(intent, ACTIVITY_TYPE), e todas estão funcionando, exceto uma.

Este, quando chamado, inicia a atividade conforme desejado, mas no log eu posso ver que onActivityResult()está sendo acionado imediatamente. A atividade aparece, mas RESULT_CANCELEDé retornada imediatamente para onActivityResult().

Interajo com a atividade, pressiono um botão que chama finish()e onActivityResult()não é chamado dessa vez (porque aparentemente um resultado já foi retornado).

Isso faz sentido para alguém? Alguém já viu esse comportamento antes?

TomBomb
fonte

Respostas:

315

Você não pode usar startActivityForResult()se sua atividade estiver sendo iniciada como singleInstanceou singleTask. standardou singleTopo modo de inicialização corrigirá o problema.

Falmarri
fonte
2
Obrigado tanto de você, eu tive isso no meu arquivo de manifesto e tinha totalmente esquecido
TomBomb
9
UAU! Parece uma coisa óbvia para adicionar aos javadocs! Passei a noite inteira tentando fazer isso funcionar, e essa resposta do SO me lembrou que minha Atividade estava definida como singleTop.
swooby
20
singleTopParece bom para mim, singleTaskno entanto estava causando esta questão e, portanto, singleInstancecom certeza gostaria de fazer também
darnmason
4
Eu também passei muito tempo depurando isso! Obrigado!!
suomi35
4
No meu caso, não definiu nenhuma classe como singleInstance ou singleTop, mas ainda está acontecendo ... alguma sugestão?
CoDe
110

Além disso, verifique se a intenção não possui o Intent.FLAG_ACTIVITY_NEW_TASKconjunto.

Dos documentos :

Esse sinalizador não pode ser usado quando o chamador está solicitando um resultado da atividade que está sendo iniciada.

James Zhang
fonte
3
Isso corrigiu o problema no meu caso. O problema não foi causado por singleInstance, singleTop nem singleTask.
Diana
Você é uma hortelã (Um salva-vidas). Este foi exatamente o meu problema quando eu queria o usuário para capturar uma imagem em um fragmento
kyay
@ Diana, você se lembra do que usou em vez de Intent.FLAG_ACTIVITY_NEW_TASK?
Keselme 6/08/19
@ Keselme Desculpe, já faz muito tempo, gostaria de poder ajudar, mas não me lembro e não consigo mais acessar esse código.
Diana
Sim, consertou. startActivityForResult não deve ser usado com Intent.FLAG_ACTIVITY_NEW_TASK
hanilozmen
21

Já vi esse comportamento antes, verifique se a atividade de destino (essa atividade especial) não está singleInstanceno arquivo AndroidManifest. Se a atividade for singleInstance, ela retornará RESULT_CANCELEDantes do lançamento!

pangcong
fonte
18

Eu também gostaria de acrescentar que você poderia chamar um aplicativo externo com:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
O que criaria uma intenção Intent.FLAG_ACTIVITY_NEW_TASKadicionada por padrão, então chame:
in.setFlags(0);
O que limpará esse sinalizador e você poderá prosseguir para:startActivityForResult(in, action);

A razão pela qual estou fazendo isso é que tenho um aplicativo utilitário com funcionalidade comum entre alguns outros aplicativos e posso manter as alterações de código em um local, em vez de me preocupar com várias atualizações.

giannileuani
fonte
Eu sei que isso é antigo, mas isso foi tão absolutamente inestimável para mim que eu queria agradecer ao usuário e apontar para quem está pulando entre as atividades que isso é ouro! Salvou minha bunda durante uma maratona hacker;)
Wes Winn
É isso que precisa de mais atenção. É a melhor solução e funciona perfeitamente para mim. Você me salvou muito tempo, muito obrigado.
Aritra Roy
Submeter a votação esta resposta, pois esse era o problema exato que eu estava tendo esta manhã! Obrigado pela solução!
Will Johnson
Obrigado. intent.setFlags (0) resolveu o problema. Agora o segundo aplicativo começa ok e volta resultar para o aplicativo chamando
Niaz
5

startActivityForResult()não funciona com uma singleInstanceou singleTaskatividade na versão pré-pirulito de Android. Desde o Android 5, ele funciona (veja esta resposta para mais detalhes).

noelicus
fonte
5

Também é acionado se você tiver a FLAG_ACTIVITY_NEW_TASKsua intenção.

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);
Roger Alien
fonte
Obrigado. Adicionei FLAG_ACTIVITY_NEW_TASK em minha atividade.
Chirag Savsani
1

Meu problema estava com a atividade de chamada. Sua declaração no AndroidManifest tinha a seguinte propriedade:

android:noHistory="true"

Alterou para "false" e agora funciona bem.

user3829751
fonte
1

O Android 4.4 tem um pequeno problema em aguardar o retorno no final do encerramento do atividade. Para resolver esse comportamento, é importante definir:

  • todas as atividades terão o mesmo atributo de afinidade da tarefa. ( TaskAffinity = "[SAME STRING]")
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

Esta solução funciona com todas as versões do Android

Veja isto para taskAffinity: https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-called-instantly/1004072

Andrea Falappi - Polipo
fonte
1

Além disso, verifique se android: noHistory = "true" na atividade do Manifest, se sim, não funcionará.

Sanju
fonte
0

Para ActivityGroupou para TabHostoutros, talvez o xxxActivityseja um subActivitydos seus pais. Então o startActivityForResultnão pode funcionar, mas o pai pode obter o resultado.

  1. ligar getParent().startActivityForResult()da sua subatividade

  2. seu pai (o ActivityGroup) poderá lidar com o onActivityResult. Então, eu criei uma subclasse ActivityGroupe lidei com isso onActivityResult.

  3. Você pode redirecionar o resultado de volta para a subatividade, se necessário. Basta obter a atividade atual por getLocalActivityManager().getCurrentActivity(). Minhas sub-atividades são herdadas de uma atividade personalizada, então adicionei uma handleActivityResult(requestCode, resultCode, data)nessa subclasse para a ActivityGroupchamada.

exemplo: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html

fantaxy025025
fonte
O que você acha sobre este caso especial ao chamar Brower web padrão: codeproject.com/Questions/990063/...
Ahmad Ebrahimi
0

onActivityResult()também passará RESULT_CANCELEDcomo resultCodese você digitar incorretamente o nome do pacote ou da classe no arquivo de manifesto.

musterjunk
fonte
0

No conjunto de manifestos do Android android:launchMode="singleTop"para a atividade que você deseja abrir com o resultado e ao abrir o sinalizador de conjunto de atividadesintent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

Krish
fonte
0

Se você definiu android:noHistory="true"a atividade no seu AndroidManifest.xml, isso causará o mesmo problema aqui.

Yu-Long Chen
fonte