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?

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.


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.


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!


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.


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).


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);

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.


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


1

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


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


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.


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);


0

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.