Perder los extras de Intent cuando regresa a Actividad

Tengo una aplicación con un flujo que es más o menos:

  • Iniciar Actividad Principal, ingrese algunos datos
  • Inicie la Actividad A, pasando una sola cadena en la Intención
  • La actividad A utiliza la cadena y ofrece al usuario algunas opciones
  • A veces, el uso iniciará Actividad B (dejando A en segundo plano)
  • Cuando el usuario regresa de la Actividad B, la Actividad A es recreada (onCreate se llama); Supongo que se ha eliminado para guardar la memoria
  • La intención devuelta por getIntent () NO tiene los datos pasados ​​a la instancia original de la Actividad A

Sé que los datos estaban allí en la primera llamada porque la aplicación moriría si no fuera.

Sé que los datos no están allí cuando el usuario vuelve a la actividad A (a través de la tecla 'atrás') porque la aplicación muere (puntero nulo de extras.getString (…) en onCreate ()).

¿Es este comportamiento pretendido?

¿Debo guardar los contenidos del paquete de extras en onSaveInstanceState ()?

Editado: fragmentos de código a continuación:

Actividad principal inicia la nueva actividad usando:

Intent i = new Intent(a, BookISBNSearch.class); i.putExtra(BookISBNSearch.BY, "isbn"); a.startActivityForResult(i, R.id.ACTIVITY_CREATE_BOOK_ISBN); 

OnCreate en BookISBNSearch lee esto:

 ... Bundle extras = getIntent().getExtras(); mIsbn = extras.getString("isbn"); String by = extras.getString(BY); ... 

Y un poco más tarde lo utiliza:

 if (mIsbn != null) { ....do some stuff.... } else if (by.equals("isbn")) { ....do some other stuff.... 

El usuario puede iniciar otra actividad de BookISBNSearch. El código que inicia la nueva actividad es:

 /* * Start scanner activity. */ private void startScannerActivity() { if (mScannerIntent == null) { mScannerIntent = new Intent("com.google.zxing.client.android.SCAN"); } if (!mScannerStarted) { mScannerStarted = true; startActivityForResult(mScannerIntent, ACTIVITY_SCAN); } } 

El usuario ejecuta el escáner, hace un montón de otras cosas y, eventualmente, presiona la tecla 'atrás' para volver a esta actividad. En ese momento se obtiene el accidente que se enumeran a continuación. La parte pertinente:

 at com.eleybourn.bookcatalogue.BookISBNSearch.onCreate(BookISBNSearch.java:142) 

Corresponde a la línea:

 } else if (by.equals("isbn")) { 

De donde concluyo que 'por' es nulo.

Además, existen otras posibles rutas de código que comienzan otras actividades (no externas) que presentan el mismo problema. Esto no ocurre en mi teléfono, ni en AVD, incluso con auto-eliminación de actividades activadas.

Sólo ocurre para una pequeña proporción de usuarios.

 java.lang.NullPointerException at com.eleybourn.bookcatalogue.BookISBNSearch.onCreate(BookISBNSearch.java:142) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) at android.app.ActivityThread.access$1500(ActivityThread.java:117) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3691) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:670) at dalvik.system.NativeStart.main(Native Method) 

Trate de escribir su Intent-data a la savedInstance!

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(getIntent() != null) { // Activity was started and got an Intent with data ... } else if(savedInstanceState != null) { // No intent is available, try getting data from savedInstance ... } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if(outState != null) { // Write here your data ... } } 

Espero que esto fue útil 🙂

  • Diferencia entre el conmutador empaquetado y el interruptor escaso dalvik opcode
  • Trigger galaxia S4 sensor de infrarrojos de desarrollo de aplicaciones?
  • Cómo ocultar la clave pública en android?
  • El tipo android.content.Context no se puede resolver. Se hace referencia indirectamente a los archivos .class requeridos
  • Escribir objetos a los paquetes
  • Android: Cómo comprobar si el número SMS entrante existe en el teléfono de contacto en BroadcastReceiver y el bloque es el número no existe
  • El código no funciona, el botón no responde
  • ¿Cómo crear un objeto con JNI?
  • ¿Cómo puedo utilizar la biblioteca Permissionsdispatcher para los nuevos permisos de tiempo de ejecución de Android M?
  • Actualizar City Spinner con notifyDataSetChanged después de seleccionar estado
  • Imagen de publicación de Android en la pared de Facebook
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.