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.
- Deshabilitar el cambio automático de diseño en Android
- Error de configuración de Sandbox en la aplicación de Android en un ID de Gmail concreto
- Pasando enums a través de interfaces de ayuda
- Código Java que comenta las mejores prácticas
- Cómo importar bibliotecas compartidas en Cmake para Android
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)
- NullPointerException en getActivity (). RunOnUiThread (nuevo Runnable () {
- La actividad no se puede asignar a la actividad
- Android incluye programación de diseño (es decir, sin XML)
- No se puede resolver el método getSupportFragmentManager () en android studio
- Android ImageAdapter con Gridview en el fragmento
- No puede enviar mensajes desde el servidor: Google Cloud Messaging
- Android - ¿Diferencia entre Thread y AsyncTask?
- Android: ¿Cómo pasar una conexión Bluetooth a otra actividad?
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 🙂