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?

Retorno de chamada de Eugene Mayevski
fonte
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.

Retorno de chamada de Eugene Mayevski
fonte
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);.

teapeng
fonte
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.

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

Sam
fonte
-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.

otimismo
fonte
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