Android: startActivityForResult attivando immediatamente OnActivityResult


144

Sto avviando attività dall'attività principale nella mia app usando la chiamata startActivityForResult(intent, ACTIVITY_TYPE) e funzionano tutte tranne una.

Questo, quando chiamato, avvia l'attività come desiderato, ma nel registro vedo che onActivityResult()viene immediatamente attivato. L'attività si presenta maRESULT_CANCELED viene immediatamente restituita a onActivityResult().

Quindi interagisco con l'attività, premo un pulsante che chiama finish()e onActivityResult()non viene chiamato questa volta (perché a quanto pare è già stato restituito un risultato).

Per qualcuno questo ha senso? Qualcuno ha mai visto questo comportamento prima?

Risposte:


315

Non puoi utilizzare startActivityForResult()se la tua attività viene avviata come singleInstanceo singleTask. standardo la singleTopmodalità di avvio risolverà il problema.


2
Grazie a entrambi, avevo questo nel mio file manifest e me ne ero completamente dimenticato
TomBomb,

9
WOW! Sembra una cosa ovvia da aggiungere ai javadocs! Ho sprecato un'intera serata cercando di farlo funzionare e questa risposta SO mi ha ricordato che la mia attività era impostata su SingleTop.
swooby

20
singleTopsembra che singleTasksingleInstance
vada

4
Ho anche passato troppo tempo a eseguire il debug di questo! Grazie!!
suomi35

4
Nel mio caso, nessuna classe è stata definita come singleInstance o singleTop, ma sta ancora accadendo ... qualche suggerimento?
CoDe

110

Inoltre, assicurarsi che l'intento non abbia il Intent.FLAG_ACTIVITY_NEW_TASKset.

Dai documenti :

Questo flag non può essere utilizzato quando il chiamante richiede un risultato dall'attività avviata.


3
Ciò ha risolto il problema nel mio caso. Il problema non è stato causato da singleInstance, singleTop né singleTask.
Diana,

Sei una zecca (un salvavita). Questo era il mio problema esatto quando volevo che l'utente catturasse un'immagine in un frammento
kyay,

@Diana, ricordi cosa hai usato invece di Intent.FLAG_ACTIVITY_NEW_TASK?
Keselme,

@Keselme Siamo spiacenti, è passato molto tempo, vorrei poterti aiutare ma non ricordo e non riesco più ad accedere a quel codice.
Diana,

Sì, risolto. startActivityForResult non deve essere utilizzato con Intent.FLAG_ACTIVITY_NEW_TASK
hanilozmen,

21

Ho già visto questo comportamento, per favore assicurati che la tua attività di destinazione (quell'attività speciale) non sia singleInstancenel file AndroidManifest. Se l'attività è singleInstance, allora tornerà RESULT_CANCELEDprima del lancio!


18

Vorrei anche aggiungere che potresti chiamare un'app esterna con:
Intent in = caller.getPackageManager().getLaunchIntentForPackage("com.your.package.here");
che creerebbe un intento con l' Intent.FLAG_ACTIVITY_NEW_TASKaggiunta di default, quindi chiama:
in.setFlags(0);
che cancellerà quel flag e quindi puoi procedere a:startActivityForResult(in, action);

Il motivo per cui sto facendo questo è che ho un'app di utilità che ha funzionalità comuni tra alcune altre app e posso mantenere le modifiche del codice in una posizione invece di preoccuparmi di più aggiornamenti.


So che questo è vecchio, ma questo è stato così assolutamente inestimabile per me che volevo dire grazie all'utente e sottolineare per chiunque salti da una attività all'altra che questo è pazzesco! Mi ha salvato il culo durante un hackathon;)
Wes Winn,

Questo è ciò che richiede più attenzione. È la soluzione migliore e funziona perfettamente per me. Mi hai risparmiato un sacco di tempo, grazie mille.
Aritra Roy,

Votazione di questa risposta in quanto si trattava esattamente del problema che stamattina avevo riscontrato! Grazie per la soluzione!
Will Johnson,

Grazie. intent.setFlags (0) ha risolto il problema. Ora la seconda app inizia bene e restituisce il risultato all'app chiamante
Niaz,

5

startActivityForResult()non funziona con a singleInstanceo singleTaskattività nella versione pre-lollipop di Android. Da Android 5 funziona (vedi questa risposta per maggiori dettagli).


5

Si innesca anche se hai FLAG_ACTIVITY_NEW_TASKdelle intenzioni.

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent, REQUEST_CODE);

Grazie. Ho aggiunto FLAG_ACTIVITY_NEW_TASK alla mia attività.
Chirag Savsani,

1

Il mio problema era con l'attività di chiamata. La sua dichiarazione in AndroidManifest aveva la seguente proprietà:

android:noHistory="true"

Modificato in "falso" e ora funziona bene.


1

Android 4.4 ha un piccolo problema nell'attesa del ritorno al termine della chiusura di actvity Per risolvere questo comportamento è importante impostare:

  • tutte le attività avranno lo stesso compito Attributo Affinità. ( TaskAffinity = "[SAME STRING]")
  • launchmode=singleTop,
  • launchIntent.SetFlags(0); // for reset default Intent flags if you launch from package manager

Questa soluzione funziona con tutte le versioni di Android

Vedi questo per taskAffinity: https://asyoulook.com/computers%20&%20internet/android-onactivityresult-being-called-instantly/1004072


1

Inoltre, controlla se android: noHistory = "true" sull'attività in Manifest, se sì, non funzionerà.


0

Per ActivityGroupo TabHoste altri, forse xxxActivityè un subActivitysuo genitore. Quindi il startActivityForResultnon può funzionare ma il genitore può ottenere il risultato.

  1. chiama getParent().startActivityForResult()dalla tua subattività

  2. tuo genitore (il ActivityGroup) sarà in grado di gestire il onActivityResult. Quindi ho creato una sottoclasse ActivityGroupe gestito questo onActivityResult.

  3. Se necessario, puoi reindirizzare il risultato all'attività secondaria. Basta avere l'attività corrente da getLocalActivityManager().getCurrentActivity(). Le mie attività secondarie ereditano da un'attività personalizzata, quindi ho aggiunto una handleActivityResult(requestCode, resultCode, data)in quella sottoclasse per la ActivityGroupchiamata.

esempio: http://www.cnblogs.com/relinson/archive/2012/03/25/startActivityForResult.html


Cosa ne pensi di questo caso speciale quando chiami il browser web predefinito: codeproject.com/Questions/990063/…
Ahmad Ebrahimi

0

onActivityResult()passerà anche RESULT_CANCELEDcome resultCodese si scrivesse erroneamente il nome del pacchetto o della classe nel file manifest.


0

Nel Manifest di Android impostato android:launchMode="singleTop"per l'attività che si desidera aprire con il risultato e durante l'apertura del flag del set di attivitàintent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);


0

Se hai definito android:noHistory="true"l'attività nel tuo AndroidManifest.xml, qui causerà lo stesso problema.

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.