onActivityResult () chiamato prematuramente


92

Inizio il Activity(discendente di PreferenceActivity) dalla mia attività lavorativa come segue:

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

MyConfigurela classe NON ha setResult()chiamate. In effetti, la MyConfigureclasse non ha alcun codice tranne OnCreate()dove carica le preferenze usando addPreferencesFromResource.

Ora onActivityResultè chiamato con requestCodedei 1458prematuramente, subito dopo MyConfigurel'attività viene eseguito. Testato su emulatori 1.6 e 2.1 e dispositivo 2.1. C'è una chiamata a essere setResult()sepolto da qualche parte PreferenceActivity? Oppure come si può spiegare questa chiamata prematura?


1
Un'attività non termina con setResults (), ma termina con finish (). Potete mostrare il metodo onCreate della vostra attività MyConfigure?
Cheryl Simon

Esatto, non è così. Tuttavia, qualcosa chiama setResult () prima del tempo e mi chiedo cosa sia. Il codice di onCreate è banale: la classe pubblica MyConfigure estende PreferenceActivity {@Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); addPreferencesFromResource (R.xml.preferences); }}
Callback di Eugene Mayevski il

come pensi di sapere che setResult si chiama?
RoflcoptrException

Questo è esattamente ciò per cui ho creato la domanda. Per scoprire perché onActivityResult viene chiamato prematuramente.
Callback di Eugene Mayevski,

Cosa dice l'output di logcat in questo periodo? In particolare il tag "ActivityManager", che mostra quali Intent vengono chiamati.
Christopher Orr

Risposte:


254

Il problema viene risolto modificando la modalità di avvio in singleTop:

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

C'è un bug / funzionalità (?) In Android, che riporta immediatamente il risultato (che non è stato ancora impostato) per Activity, dichiarato come singleTask(nonostante il fatto che l'attività continui a essere eseguita). Se cambiamo launchModel'attività genitore da singleTaska singleTop, tutto funziona come previsto - il risultato viene riportato solo dopo che l'attività è terminata. Sebbene questo comportamento abbia una spiegazione certa ( singleTaskpuò esistere solo un'attività e possono verificarsi più camerieri per essa), questa è ancora una restrizione non logica per me.


2
Sembra un insetto! ^^ comportamento molto strano!
Felipe

7
Se l'attività ha la modalità di lancio singleTask, non è necessario ricevere risultati dalle attività secondarie utilizzando onActivityResult. Le attività secondarie chiamano semplicemente finish () e quindi iniziano l'attività principale con l'intento dei dati. Nell'attività principale è necessario sovrascrivere il metodo onNewIntent ed elaborare l'intento ricevuto.
Nik

43
Anche launchMode = "singleInstance" causa questo comportamento
ffleandro

1
Sembra che questo non abbia funzionato per me, ho provato singleTop sull'attività dei genitori ma senza successo. Ho anche impostato il flag di intenti in FLAG_ACTIVITY_SINGLE_TOP, anche se la richiesta ora mostra il valore corretto ma il risultato è sempre 0.
Neon Warge

11
accade su Kitkat 4.4.4, non su Lolipop.
Somasundaram Mahesh

18

Ho risolto il mio problema dopo aver rimosso intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);prima di chiamare fragment.startActivityForResult(intent, 0);.


1
Grazie! Questo ha risolto il mio problema. C'è una spiegazione per questo da qualche parte?
Conner Harkness

C'è una spiegazione per questo nei documenti per il flag in questi giorni "Questo flag non può essere utilizzato quando il chiamante richiede un risultato dall'attività avviata". Beh, non è una spiegazione ma almeno un avvertimento!
Noviziato del Codice il

4

Ho appena rimosso tutto il mio "android: launchMode" personalizzato dalla mia attività e tutto ha funzionato a meraviglia. Non è una buona idea cambiarlo quando non sai ESATTAMENTE cosa sta capendo Android ... Android è un po 'complicato in questo modo.


1

Questo è successo a me quando l'intento aveva Intent.FLAG_RECEIVER_FOREGROUNDimpostato la bandiera.

(Sì, quella bandiera non è correlata all'attività, ma l'avevo a tutte le mie intenzioni come parte di una soluzione con fucile a pompa a un problema diverso .)


-1

Anche in questo caso, come nel commento di Mayra, setResult()non ha nulla a che fare con il tuo problema. per qualche ragione, la MyConfigureclasse termina se stessa e quando accade PreferenceActivitypresume che potrebbe esserci un risultato daMyConfigure perché è così che hai scritto il codice.

questo accade anche quando si forza indietro qualsiasi attività con cui è iniziata startActivityForResult() ...

Quindi, penso che sia meglio concentrarsi sul motivo per cui la tua MyConfigurelezione è terminata con la forza.


La classe MyConfigure NON finisce, le tue ipotesi sono sbagliate, scusa. Se lo facesse, non ci sarebbero dubbi
Eugene Mayevski 'Callback
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.