¿Cómo administrar `startActivityForResult` en Android?

En mi actividad, startActivityForResult una segunda actividad de la actividad principal mediante startActivityForResult . En mi segunda actividad hay algunos métodos que terminan esta actividad (tal vez sin resultado), sin embargo, solo uno de ellos arroja un resultado.

Por ejemplo, de la actividad principal llamo una segunda. En esta actividad, estoy verificando algunas características del teléfono como, por ejemplo, si tiene una cámara. Si no tiene, entonces cerraré esta actividad. Además, durante la preparación de MediaRecorder o MediaPlayer si ocurre un problema, cierro esta actividad.

Si su dispositivo tiene una cámara y la grabación está completa, luego de grabar un video si el usuario hace clic en el botón hecho, entonces enviaré el resultado (dirección del video grabado) a la actividad principal.

¿Cómo verifico el resultado de la actividad principal?

Desde su FirstActivity llame a SecondActivity usando el método startActivityForResult()

Por ejemplo:

 Intent i = new Intent(this, SecondActivity.class); startActivityForResult(i, 1); 

En su SecondActivity configure los datos que desea devolver a FirstActivity . Si no desea regresar, no configure ninguno.

Por ejemplo: en secondActivity si desea enviar datos de vuelta:

 Intent returnIntent = new Intent(); returnIntent.putExtra("result",result); setResult(Activity.RESULT_OK,returnIntent); finish(); 

Si no desea devolver datos:

 Intent returnIntent = new Intent(); setResult(Activity.RESULT_CANCELED, returnIntent); finish(); 

Ahora, en su clase FirstActivity, escriba el siguiente código para el método onActivityResult() .

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { if(resultCode == Activity.RESULT_OK){ String result=data.getStringExtra("result"); } if (resultCode == Activity.RESULT_CANCELED) { //Write your code if there's no result } } }//onActivityResult 

¿Cómo verificar el resultado de la actividad principal?

Debe anular Activity.onActivityResult() luego verificar sus parámetros:

  • requestCode identifica qué aplicación devolvió estos resultados. Esto lo define cuando llama a startActivityForResult() .
  • resultCode le informa si esta aplicación tuvo éxito, falló o algo diferente
  • data contiene cualquier información devuelta por esta aplicación. Esto puede ser null .

Complementando la respuesta de @ Nishant, la mejor manera de devolver el resultado de la actividad es:

 Intent returnIntent = getIntent(); returnIntent.putExtra("result",result); setResult(RESULT_OK,returnIntent); finish(); 

Estaba teniendo un problema con

 new Intent(); 

Entonces descubrí que la forma correcta es usar

 getIntent(); 

para obtener la intención actual

Ejemplo

Para ver todo el proceso en contexto, aquí hay una respuesta suplementaria. Vea mi respuesta más completa para más explicación.

enter image description here

MainActivity.java

 public class MainActivity extends AppCompatActivity { // Add a different request code for every activity you are starting from here private static final int SECOND_ACTIVITY_REQUEST_CODE = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // "Go to Second Activity" button click public void onButtonClick(View view) { // Start the SecondActivity Intent intent = new Intent(this, SecondActivity.class); startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE); } // This method is called when the second activity finishes @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // check that it is the SecondActivity with an OK result if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) { if (resultCode == RESULT_OK) { // Activity.RESULT_OK // get String data from Intent String returnString = data.getStringExtra("keyName"); // set text view with string TextView textView = (TextView) findViewById(R.id.textView); textView.setText(returnString); } } } } 

SecondActivity.java

 public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } // "Send text back" button click public void onButtonClick(View view) { // get the text from the EditText EditText editText = (EditText) findViewById(R.id.editText); String stringToPassBack = editText.getText().toString(); // put the String to pass back into an Intent and close this activity Intent intent = new Intent(); intent.putExtra("keyName", stringToPassBack); setResult(RESULT_OK, intent); finish(); } } 

Si desea actualizar la interfaz de usuario con el resultado de la actividad, no puede usar this.runOnUiThread(new Runnable() {} Al hacer esto, la IU no se actualizará con un nuevo valor. En su lugar, puede hacer esto:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_CANCELED) { return; } global_lat = data.getDoubleExtra("LATITUDE", 0); global_lng = data.getDoubleExtra("LONGITUDE", 0); new_latlng = true; } @Override protected void onResume() { super.onResume(); if(new_latlng) { PhysicalTagProperties.this.setLocation(global_lat, global_lng); new_latlng=false; } } 

Esto parece tonto pero funciona bastante bien.

Para aquellos que tienen problemas con requestCode incorrecto en onActivityResult

Si está llamando a startActivityForResult() desde su Fragment , la Actividad que posee el Fragmento cambia el startActivityForResult() .

Si quiere obtener el código de resultado correcto en su actividad, intente esto:

Cambio:

startActivityForResult(intent, 1); A:

getActivity().startActivityForResult(intent, 1);

Primero use startActivityForResult() con parámetros en la primera Activity y si desea enviar datos de la segunda Activity a la primera Activity luego pase el valor usando el método Intent with setResult() y obtenga esos datos dentro del onActivityResult() en la primera Activity .

Problema muy común en Android
Se puede dividir en 3 piezas
1) comienza la actividad B (sucede en la actividad A)
2) Establecer los datos solicitados (sucede en la actividad B)
3) Recibir los datos solicitados (sucede en la actividad A)

1) startActivity B

 Intent i = new Intent(A.this, B.class); startActivity(i); 

2) Establecer los datos solicitados

En esta parte, usted decide si desea enviar datos de vuelta o no cuando ocurre un evento en particular.
Por ejemplo: en la actividad B hay un EditText y dos botones b1, b2.
Al hacer clic en el botón b1, los datos vuelven a la realidad A
Al hacer clic en el botón b2 no se envían datos.

Enviando datos

 b1......clickListener { Intent resultIntent = new Intent(); resultIntent.putExtra("Your_key","Your_value"); setResult(RES_CODE_A,resultIntent); finish(); } 

No enviando datos

 b2......clickListener { setResult(RES_CODE_B,new Intent()); finish(); } 

el usuario hace clic en el botón Atrás
Por defecto, el resultado se establece con el código de respuesta Activity.RESULT_CANCEL

3) Recuperar el resultado

Para esa anulación en el método de respuesta de actividad

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RES_CODE_A) { // b1 was clicked String x = data.getStringExtra("RES_CODE_A"); } else if(resultCode == RES_CODE_B){ // b2 was clicked } else{ // back button clicked } } 

El guiño de @Nishant es correcto. En mi caso, el onActivityResult nunca se llamó debido a la configuración en AndroidManifest. Asegúrese de que su segunda actividad (o el remitente) no haya configurado esta línea en el Manifiesto de Android.

  

Si es así, elimine android:parentActivityName=".FirstActivity"