onActivityResult () chamado prematuramente


92

Eu começo o Activity(descendente de PreferenceActivity) da minha atividade de trabalho da seguinte forma:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1458)
        loadInfo();
}

void showSettingsDialog()
{
    startActivityForResult(new Intent().setClass(this, MyConfigure.class), 1458);
}

MyConfigureclasse NÃO tem setResult()chamadas. Na verdade, a MyConfigureclasse não tem nenhum código, exceto OnCreate()onde carrega as preferências usando addPreferencesFromResource.

Agora onActivityResulté chamado requestCodede 1458prematuramente, logo após a MyConfigureatividade ser executada. Testado em emuladores 1.6 e 2.1, bem como em dispositivos 2.1. Existe uma chamada para setResult()enterrado em algum lugar PreferenceActivity? Ou de que outra forma essa chamada prematura pode ser explicada?


1
Uma atividade não termina em setResults (), ela termina em finish (). Você pode mostrar o método onCreate de sua atividade MyConfigure?
Cheryl Simon

Certo, não é. No entanto, algo chama setResult () antes do tempo e estou me perguntando o que é. O código de onCreate é trivial: public class MyConfigure extends PreferenceActivity {@Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); addPreferencesFromResource (R.xml.preferences); }}
Retorno de chamada de Eugene Mayevski

como você acha que sabe que setResult é chamado?
RoflcoptrException

É exatamente para isso que criei a pergunta. Para descobrir por que onActivityResult é chamado prematuramente.
Callback de Eugene Mayevski em

O que a saída do logcat diz nesse período? Especificamente, a tag "ActivityManager", que mostra quais Intents estão sendo chamados.
Christopher Orr

Respostas:


254

Isso é corrigido alterando o modo de inicialização para singleTop:

    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop">

Há um bug / recurso (?) No Android, que relata imediatamente o resultado (que ainda não foi definido) para Activity, declarado como singleTask(apesar do fato de que a atividade continua em execução). Se mudarmos launchModea atividade pai de singleTaskpara singleTop, tudo funcionará conforme o esperado - o resultado é relatado somente após o término da atividade. Embora esse comportamento tenha certa explicação (apenas uma singleTaskatividade pode existir e podem ocorrer vários garçons para ela), essa ainda é uma restrição não lógica para mim.


2
Parece um bug! ^^ comportamento muito estranho!
Felipe

7
Se a atividade tiver o modo de inicialização singleTask, não será necessário receber resultados de subatividades usando onActivityResult. As subatividades simplesmente chamam finish () e, em seguida, iniciam a atividade principal com intenção de dados. Na atividade principal, você deve substituir o método onNewIntent e processar a intenção recebida.
Nik

43
launchMode = "singleInstance" também causa esse comportamento
ffleandro 01 de

1
Parece que isso não funcionou para mim, eu tentei singleTop na atividade dos pais, mas sem sucesso. Eu também defini o sinalizador de intent em FLAG_ACTIVITY_SINGLE_TOP, embora a solicitação agora mostre o valor correto, mas o resultado é sempre 0.
Neon Warge

11
isso acontece no Kitkat 4.4.4, não acontecendo no Lolipop.
Somasundaram Mahesh

18

Resolvi meu problema depois de remover intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);antes de ligar fragment.startActivityForResult(intent, 0);.


1
Obrigado! Isso resolveu meu problema. Existe uma explicação para isso em algum lugar?
Conner Harkness

Há uma explicação para isso nos documentos para o sinalizador nos dias de hoje "Este sinalizador não pode ser usado quando o chamador está solicitando um resultado da atividade que está sendo lançada". Bem, não é uma explicação, mas pelo menos um aviso!
Código do Noviciado

4

Acabei de remover todo o meu "android: launchMode" personalizado da minha Activity e tudo funcionou perfeitamente. Não é uma boa ideia mudar isso quando você não sabe EXATAMENTE o que o Android entende ... Android é um pouco complicado nesse sentido.


1

Isso aconteceu comigo quando a intenção tinha o Intent.FLAG_RECEIVER_FOREGROUND definida.

(Sim, esse sinalizador não está relacionado à atividade, mas eu o tinha em todas as minhas intenções como parte de uma solução rápida para um problema diferente .)


-1

Novamente, como no comentário de Mayra, setResult()não tem nada a ver com o seu problema. por algum motivo, a MyConfigureclasse termina sozinha e quando isso acontece, PreferenceActivityapenas assume que pode haver um resultado deMyConfigure porque foi assim que você escreveu o código.

isso também acontece quando você força de volta qualquer atividade iniciada com startActivityForResult() ...

Então, eu acho que é melhor se concentrar em por que sua MyConfigureaula foi terminada à força.


A classe MyConfigure NÃO termina, suas suposições estão erradas, desculpe. Se assim fosse, não haveria dúvida
Callback de Eugene Mayevski
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.