Actividad que se crea dos veces en android

En primer lugar, soy nuevo en Android Development así que por favor tenga paciencia conmigo.

Voy a empezar desde la interfaz de usuario, tengo un botón que una vez que toque, comienza una actividad para un resultado.

public class GUIActivity extends Activity @Override public void onClick(....){ Intent intent = new Intent(getApplicationContext(), GetImageActivity.class); intent.putExtra("action", FROM_CAMERA); startActivityForResult(intent, GET_IMAGE); } @Override onActivityResult(int requestCode, int resultCode, Intent data){ Log(TAG, "onActivityResult"); //handle result } } 

La clase GetImageActivity es un contenedor para otras dos actividades, una para capturar una imagen de la cámara y otra para obtenerla de la galería. Devuelve y Uri objeto de la imagen seleccionada.

 public class GetImageActivity extends Activity{ private Uri mediaUri; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); Bundle extras = getIntent().getExtras(); int action = extras.getInt("action"); Log.d(TAG, "onCreate"); switch(action){ case FROM_CAMERA: mediaUri = Uri.fromFile(new File(....)); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, mediaUri); Log.d(TAG, "Calling camera activity" startActivityForResult(intent, action); break; case FROM GALLERY: //... } } @Override onActivityResult(int requestCode, int resultCode, Intent data){ Log.d(TAG, "onActivityResult"); switch(requestCode){ case FROM_CAMERA: if(resultCode == Activity.RESULT_OK){ Intent data = new Intent(); data.putExtra("uri", mediaUri); setResult(Activity.RESULT_OK, data); finish(); }else{ Log.e(TAG, "Camera activity failed!"); setResult(Activity.RESULT_CANCELED); finish(); } break; case FROM_GALLERY: //... } } } 

Esto es lo que se espera que suceda cuando el usuario hace clic en el botón:

  • La actividad de la cámara debe comenzar.
  • Una vez que el usuario toma una imagen debe devolver su URI a la clase GUI.

A veces (suele ser un 50% de probabilidad) funciona en espera, pero otras veces esto es lo que sucede:

  • Se inicia la actividad de la cámara.
  • El usuario toma una foto.
  • La actividad de la cámara empieza de nuevo.
  • El usuario puede tomar otra imagen o volver atrás.
  • En cualquier caso, el URI que vuelve a la clase GUI no existe.

He añadido un par de líneas de registro de depuración para seguir la secuencia de eventos. Cuando consigo el mal comportamiento esto es la salida que consigo:

  • GetImageActivity – onCreate
  • GetImageActivity – Actividad de la cámara de llamada

La cámara se abre, y una vez que he tomado una foto dice:

  • GetImageActivity – onCreate (de nuevo)
  • GetImageActivity – Actividad de la cámara de llamada
  • GetImageActivity – onActivityResult

La cámara se abre por segunda vez. El usuario toma otra foto y:

  • GetImageActivity – onActivityResult
  • GUIActivity – onActivityResult

Así que mi pregunta es … ¿qué podría hacer que la GetImageActivity se llamara dos veces?

El problema es el manejo inadecuado del ciclo de vida de la Activity .

La segunda llamada a onCreate es para manejar el resultado.

Android puede elegir destruir una Activity que está esperando la llamada a onActivityResult ; Especialmente cuando la memoria libre se está agotando. Algunos dispositivos aparecen más agresivos sobre la destrucción de las actividades que están en la pila de tareas. Puedo recrear con seguridad el problema en un dispositivo Samsung establecido en un modo de depuración llamado "modo estricto".

Puede verificar si se trata de su problema registrando las llamadas a onCreate & onDestroy .

En el caso de una actividad destruida, cuando el resultado de la actividad deba ser procesado, Android recreará la Activity , pasando un savedInstanceState a onCreate . Por lo tanto, el remedio es comprobar el valor de savedInstanceState en su GetImageActivity.onCreate . Si no es null entonces no haga ninguna llamada a startActivity porque su Activity está siendo recreada para llamar a onActivityResult .

Opcionalmente, si necesita conservar cualquier estado, anule la onSaveInstanceState(Bundle outState) y coloque los datos que necesita en outState .

Agregue esto a la definición de su actividad en AndroidManifest.xml:

 android:launchMode = "singleInstance" 

Cuando llama a startActivityForResult le dice a Android que desea que el resultado se entregue a la Activity que está realizando esa llamada. Lo que explica lo que ves al registrar GetImageActivity - onCreate (again) .

Puesto que usted llama a startActivityForResult en su primera actividad, es decir, GUIActivity que debería llamar a setResult en GetImageActivity para GetImageActivity correctamente el resultado.

Así que en GetImageActivity.onActivityResult() justo antes de llamar a finish() debería llamar a setResult para que cuando regrese a GUIActivity pueda manejar el resultado esperado.

Agrega esto a la definición de tu actividad en Androidmanifest.xml …

Android: launchMode = "singleTask"

  • Mejora del análisis de Java / Kotlin JSON
  • Java JNI vs. Android NDK
  • ¿Puede S3 de Amazon devolver los resúmenes de objetos en el orden de la fecha?
  • ¿El selector de archivos de Android 4.4 WebView no se abre?
  • Añadir imagen a Media Gallery - Android
  • En la transformación Circle Hough, ¿cuál es la razón inversa de la resolución del acumulador (dp) y cómo afecta la detección de círculos?
  • Nullpointer Excepción después de eliminar la entrada de la base de datos SQL
  • Procesamiento para Android, uso de bibliotecas
  • Cómo borrar el contenido del archivo de texto sin borrarlo
  • Android Alert Dialog no puede encontrar la vista
  • Combinación de celdas en Excel mediante Apache POI
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.