2012-04-29 17 views
7

Tengo una aplicación con un flujo que es más o menos:Perder extras Intención cuando regrese a la actividad

  • de inicio de la actividad principal, introduzca algunos datos
  • Inicio Actividad A, que pasa una sola cadena en la Intención
  • Actividad a utiliza la cuerda y le da al usuario algunas opciones
  • veces el uso se iniciará la actividad B (salida a en segundo plano)
  • Cuando el usuario vuelve de la Actividad B Actividad a se recrea (i onCreate s llamado); Lo que supongo que ha sido eliminado para ahorrar memoria
  • La intención devuelto por getIntent() no tiene los datos que se pasan a la instancia original de Actividad A

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

Sé que los datos no están allí cuando el usuario regresa a la Actividad A (mediante la tecla 'volver') porque la aplicación muere (puntero nulo de extras.getString (...) en onCreate()).

¿Tiene este comportamiento previsto?

¿Debo estar guardando el contenido del paquete de extras en onSaveInstanceState()?

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

Actividad Principal comienza 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 desde BookISBNSearch. El código que se 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, finalmente, presiona la tecla 'atrás' para volver a esta actividad. En ese punto, obtienen el bloqueo que se detalla 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 la que la conclusión de que 'por' es nulo.

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

Solo 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) 
+3

En lugar de describir el código que nos debe pegarlo. Nadie puede ayudarte de otra manera. – Aidanc

+0

Hecho. Código agregado arriba. – RabidMutant

Respuesta

1

¡Intente escribir su Intento de datos en la instancia guardada!

@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 era útil :)

+0

onCreate * is * call. La razón por la que se llama es porque la actividad se eliminó en la memoria libre. – RabidMutant

+0

Luego escriba sus datos de Intento en el SavedInstanceBundle – kyp

+1

Sí, esa es la solución alternativa que sugerí. Mi pregunta es * debería * Android preservar los Extras (es decir, ¿es esto un error). – RabidMutant

Cuestiones relacionadas