2011-05-02 12 views
21

Ésta es la navegación de mi solicitud:¿Cómo puedo pasar valores entre Actividades en Android?

Activity1 llamadas Activity2Activity2.finish(), llame Activity3Activity3.finish()

Cuando Activity3 acabados, se llama al método de Activity1onResume. ¿Ahora cómo puedo pasar un valor de Activity3 a Activity1?

+0

[este enlace para otra forma de pasar la actividad de datos3 a activity1] (http://stackoverflow.com/a/42268095/7399521) –

Respuesta

47

Umesh muestra una buena técnica, pero creo que quieres la dirección opuesta.

Paso 1

Al iniciar Actividad 2 y 3, utilice startActivityForResult. Esto le permite manejar el resultado en la actividad de llamada.

startActivityForResult(MY_REQUEST_ID); 

Paso 2

en las actividades 2 y 3, llame setResult(int, Intent) para devolver un valor:

Intent resultData = new Intent(); 
resultData.putExtra("valueName", "valueData"); 
setResult(Activity.RESULT_OK, resultData); 
finish(); 

Paso 3

En su activty vocación, implementar onActivityResult y obtenga los datos:

protected void onActivityResult(int requestCode, int resultCode, 
      Intent data) { 
     if (requestCode == MY_REQUEST_ID) { 
      if (resultCode == RESULT_OK) { 
      String myValue = data.getStringExtra("valueName"); 
      // use 'myValue' return value here 
      } 
     } 
} 

Editar:

Técnica # 2

Sí, también puede utilizar el estado de aplicación mundial mediante la adición de una clase a la aplicación que se extiende Application, vea este stackoverflow answer

+0

No puedo usar este método, porque activity2 es final y activity3 no puede devolver valor a activity1.There no es variable con el alcance de la aplicación? – magemello

+0

Sí puede devolver el valor de la Actividad 3 a la Actividad 2, luego devolver el mismo valor de Actiivty de la actividad 2 a la Actividad 1. Simplemente páselo por ambos niveles. Pero tiene razón, hay otra técnica para usar la clase base de la aplicación de Android para almacenar el estado global de la aplicación. Ver mi edición para más detalles –

2

utilizar el ID de sesión a la actividad signout en la intención que está utilizando para iniciar la actividad:

Intent intent = new Intent(getBaseContext(), SignoutActivity.class); 
intent.putExtra("EXTRA_SESSION_ID", sessionId); 
startActivity(intent) 

ver este tutorial.

0

Por qué molestarse en seguir ese tipo de estructura ... si tres vuelven a ¿mi? Simplemente envíe un intento con sus datos de tres a uno y trátelo en consecuencia.

0

Enviar una intención de la actividad 3 a 1 requeriría algún disparador como un botón o quizás el método de ciclo de vida onStop para enviarlo. Es mejor que el resultado se envíe automáticamente con el método setResult.

0

También hay otra técnica, puede llamar al método startActivity(new Intent(getApplicationContext(),Activity1.class)) junto con la clase Bundle para transferir datos de activity3 a activity1.

0

En Android es posible lanzar otra aplicación de un nombre de paquete especificado , pasando un argumento a ella.

public static void launchApp(Context context, String packageName) { 
    Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName); 

    if(intent == null) { 
     intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName)); 
    } 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.putExtra(Intent.EXTRA_TEXT, "*argument to send*"); 
    context.startActivity(intent); 
} 

El código siguiente se puede utilizar para recuperar el argumento en la aplicación de destino. Sólo

public static String getArgument(Activity activity) { 
    return activity.getIntent().getStringExtra(Intent.EXTRA_TEXT); 
} 

se necesita una referencia a la actividad, esto es útil en la Unidad donde es un poco incómodo de Actividad subclase.

Cuestiones relacionadas