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.