2012-04-06 10 views
8

Ho 2 Attività, ognuna in applicazioni separate. Activity1 ha un pulsante l'utente può cliccare e chiama la seconda attività utilizzando un intento nella sua onClick() metodo:Android onActivityResult chiamato in anticipo

Intent myIntent = getPackageManager().getLaunchIntentForPackage(com.myProject.Activity2); 
startActivityForResult(myIntent, 600); 

Questo lancia correttamente Activity2 da Activity1, ma onActivityResult viene chiamato in Activity1 prima onCreate viene chiamato in Activity2, invece di in onBackPressed() dove ho impostato l'intento di ritorno.

Ecco il metodo per onCreate Activity2:

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 

Ecco la versione corrente di onBackPressed metodo per Activity2:

@Override 
public void onBackPressed() { 
    Intent intent = new Intent(); 
    intent.putExtra("Stuff", someStuff); 

    if(getParent()==null){ 
     setResult(Activity.RESULT_OK, intent); 
    }else{ 
     getParent().setResult(Activity.RESULT_OK, intent); 
    } 
    finish(); 
    super.onBackPressed(); 
} 

mio AndroidManifest.xml ha il seguente filtro intenti per Activity2:

<intent-filter> 
    <action android:name="android.intent.action.MAIN"/> 
    <category android:name="android.intent.category.LAUNCHER"/> 
</intent-filter> 

Ho verificato che il mio launchMode è standard (e non singleTask, ecc.) Come consigliato here e il mio codice di richiesta non è negativo come avvertito here. Ho anche provato lo android:launchMode="singleTop", ma anche quello era un no-go.

Ho provato anche non chiamare finish() in onBackPressed() per Activity2 come detto here (anche con un solo super.onBackPressed() come suggerito here) e di nuovo definendolo come suggerito here.

Inoltre, ho provato a commentare la riga intent.putExtra("Stuff", someStuff); perché sembrava causare problemi per this person.

Qualche idea su cosa potrei fare male?

risposta

9

ecco la soluzione finale che ha avuto cura di esso:

ho cambiato l'intento per Activity1 al seguente:

Intent myIntent = new Intent(); 
myIntent.setClassName("com.myProject", "com.myProject.Activity2"); 
startActivityForResult(myIntent, 600); 

Per qualche ragione Android richiede il nome completo per il secondo parametro oltre al nome del pacchetto dato dal primo parametro. Ora funziona! :)

+1

Grazie mille per essere tornato e postare la tua soluzione. Sono rimasto bloccato su questo problema da molto tempo e ho anche provato tutte le soluzioni che hai trovato nella tua domanda senza successo. Questo l'ha risolto e ha reso la mia giornata molto più bella =) –

+0

Io uso startActivityForResult SENZA setClassName o nomi completi in tutti i miei progetti e funzionano tutti perfettamente tranne per un caso. Quindi ho provato la tua soluzione in quel caso e non ha fatto alcuna differenza. – user316117

+0

2h !! Grazie mille per la soluzione – Anthone

0

Non so quale sia il tuo problema. Il modo in cui stai creando l'intenzione in Activity1 è dispari; questo metodo non è pensato per la creazione di intenti che avviano un'altra attività nella stessa app. Alcuni sviluppatori usano il costruttore Intent (Context, Class <>). Preferisco utilizzare Intent (azione String) con una stringa di azione personalizzata definita solo nella mia app (che è più facile codificare correttamente).

Inoltre, il filtro intentato che hai specificato per Activity2 viene in genere utilizzato per un'attività avviata direttamente dalla schermata Home.

Dov'è il codice onCreate() per activity2? Dov'è il codice per onBackPressed()? Puoi dimostrarmi che setResult() è chiamato prima di qualche altro codice in Activity2? Dovresti eseguire le attività nel debug. Assicurarsi che Activity2 riceva l'intento che si ritiene opportuno, quindi tracciare passo per passo le istruzioni eseguite fino a setResult(). La cosa non da fare è lanciare soluzioni al codice prima di capire qual è il problema di fondo.

Per quanto posso dire finora, Activity1 sta inviando un Intent, e quindi viene chiamato onActivityResult. Nient'altro è stato provato finora.

+0

Grazie per il commento: ho aggiunto i metodi 'onCreate' e' onBackPressed' alla domanda. Ho eseguito il debug molte volte e utilizzando i break point sono stato in grado di mostrare che'AttivitàResult di Activity1 viene richiamato quando Activity2 viene lanciato per la prima volta, prima che Activity2 ritorni e non venga richiamato quando ritorna. – user1205577

+0

Ho anche provato a creare un intent usando 'Intent (context, Activity2.class)', ma si lamentava che non riusciva a trovare la classe (probabilmente perché si trova in un'altra applicazione). Ho provato alcune varianti di utilizzo del nome completo del percorso e anche questo era un no-go. – user1205577

1

Accadrà se il flag "singleInstance" è impostato quando si avvia l'attività.

+0

Grazie jbaylina la tua risposta è utile per me – Swapnil

Problemi correlati