2012-04-06 16 views
8

Tengo 2 actividades, cada una en aplicaciones separadas. Actividad1 tiene un botón el usuario puede hacer clic y llama a la segunda actividad utilizando una intención en su onClick() método:Android onActivityResult llamado early

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

Esto inicia correctamente Actividad2 de Actividad1, pero onActivityResult se llama en Actividad1 antes onCreate obtiene la llamada en Actividad2, en vez de en onBackPressed() donde configuré el intento de devolución.

Aquí es el método para onCreate Actividad2:

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

Aquí es la versión actual de onBackPressed método para Actividad2:

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

Mi AndroidManifest.xml tiene el siguiente filtro de intención para Actividad2:

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

He verificado que mi launchMode es standard (y no singleTask, etc.) según lo aconsejado here y mi código de solicitud no es negativo como advertido here. También probé android:launchMode="singleTop", pero eso fue un no-go también.

También probé no llamar finish() en onBackPressed() para Actividad2 como se mencionó here (también con sólo super.onBackPressed() como se sugiere here) y otra vez que calificó como se sugiere here.

Probé a comentar la línea intent.putExtra("Stuff", someStuff);, ya que parecía causar problemas para this person.

¿Alguna idea de lo que podría estar haciendo mal?

Respuesta

9

Así que aquí es la solución final que se encargó de ello:

he cambiado la intención de Actividad1 a lo siguiente:

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

Por alguna razón Android requiere el nombre completo para el segundo parámetro además del nombre del paquete dado por el primer parámetro. ¡Ahora funciona! :)

+1

Muchas gracias por regresar y publicar su solución. He estado atascado en este problema durante mucho tiempo y también intenté todas las soluciones que encontraste en tu pregunta en vano. Esto lo solucionó e hizo que mi día fuera muchísimo mejor =) –

+0

Uso startActivityForResult SIN setClassName o nombres completamente calificados en todos mis proyectos y todos funcionan perfectamente excepto en un caso. Así que probé su solución en ese caso y no hizo ninguna diferencia. – user316117

+0

2h !! Gracias tan mutch para la solución – Anthone

0

No estoy seguro de cuál es su problema. La forma en que está creando la intención en Activity1 es impar; ese método no está destinado a crear intenciones que inicien otra actividad en la misma aplicación. Algunos desarrolladores usan el constructor Intent (Context, Class <>). Prefiero usar Intent (Acción de cadena) con una cadena de acción personalizada definida solo en mi aplicación (que es más fácil de codificar correctamente).

Además, el filtro de intención que ha especificado para Activity2 generalmente se usa para una actividad que se inicia directamente desde la pantalla de inicio.

¿Dónde está el código onCreate() para activity2? ¿Dónde está el código para onBackPressed()? ¿Puede probarme que se llama a setResult() antes que a algún otro código en Activity2? Debes ejecutar las actividades en depuración. Asegúrese de que Activity2 esté recibiendo la intención que cree que debería, luego trace paso a paso las instrucciones que se ejecutan hasta setResult(). Lo que no es hacer es arrojar soluciones al código antes de comprender cuál es el problema subyacente.

Por lo que puedo decir hasta ahora, Activity1 está enviando un Intent, y luego se llama a onActivityResult. Nada más está probado hasta ahora.

+0

Gracias por el comentario: he agregado los métodos 'onCreate' y' onBackPressed' a la pregunta. Ejecuté la depuración muchas veces y con los puntos de interrupción pude mostrar que el 'onActivityResult' de Activity1 se llama cuando Activity2 se lanza por primera vez, antes de que Activity2 vuelva alguna vez, y no se vuelve a llamar cuando vuelve. – user1205577

+0

También intenté crear una intención usando 'Intento (contexto, Activity2.class)', pero se quejó de que no podía encontrar la clase (probablemente porque está en otra aplicación). Intenté algunas variaciones de usar el nombre completo de la ruta y eso fue un no-go también. – user1205577

1

Ocurrirá si se establece el indicador "singleInstance" cuando inicia la actividad.

+0

Gracias jbaylina su respuesta es provechosa para mí – Swapnil

Cuestiones relacionadas