savedinstancestate practices not example called best activity android android-activity

practices - Android: onSaveInstanceState no se llama desde la actividad



save instance state android fragment (4)

Eventualmente tendrá que escribir el historial / historial en un almacenamiento persistente. En el caso de que el dispositivo se cierre como un ejemplo, así como evitar un ejemplo artificial (en mi opinión) en el que llame a onSaveInstanceState en onPause (lo que necesitará hacer para obtener el paquete que desea que se transfiera onRestoreInstanceState que usted puede pasar luego a restoreState ).

Por lo tanto, además de reconsiderar su diseño (si el usuario cerró su aplicación y usted no está creando un navegador, ¿realmente desea mantener el mismo historial?), Debe buscar las SharedPreferences y cómo usarlas.

Lamentablemente, no se puede agrupar en preferencias compartidas, ni recomendaría tratar de escribir el paquete a través de Parcelable (solo está destinado a IPC, no a almacenamiento persistente). Pero lo que puedes hacer es almacenar todas las primitivas que almacena el paquete. Esto también puede ser inventado, pero me parece la única forma de obtener almacenamiento permanente.

Y luego reconstruya su paquete a través de las primitivas almacenadas en SharedPreferences, y pase eso a restoreState() . Puede consultar el código fuente de Android para ver qué webView.saveState() realmente hace (busqué el código 2.1 y parece escribir un int, un objeto serializable y luego otro paquete para el certificado SSL. El paquete SSL cert sí mismo son solo cuatro enteros). Por encima de todo, escribiría todas las primitivas que pudiera, y luego almacenaría la ubicación (cadena) del archivo local en el que también escribe los datos serializados.

Incluso si tiene una colección ordenada de toda la lista BackForward, no estoy seguro de cómo traducir eso en goBack() y goForward() usando esos valores (hay un método protegido que implica agregar elementos a la lista pero puede no tiene acceso a eso). A MENOS que use restoreState() , por eso vamos a todo el trabajo para reconstruir el paquete correctamente.

En serio, a menos que mis habilidades de búsqueda sean abismales (completamente posible), almacenar el historial de WebView en lugares más allá de donde saveInstanceState/restoreInstanceState puede hacer su trabajo por usted no parece ser un problema con el que muchas personas se han encontrado. Es decir, no muchas personas intentan persistir en el historial de WebView cuando el usuario cierra de forma explícita su aplicación, por lo que debe preguntarse por qué lo hace.

¡Disculpa si hay una manera realmente fácil de almacenar esta información de forma persistente y volver a cargar en un WebView por cierto!

Tengo una Actividad A que llama Actividad B. En la Actividad B, cuando hago clic en un botón, se invoca a finish (), que a su vez llama a Destroy () de la Actividad B y vuelve a la actividad A.

De acuerdo con la documentación de Android, se llama a Before onDestroy, se llamará a onSaveInstanceState (paquete Bundle), donde hago lo siguiente.

@Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); System.out.println("Saving webview state"); Log.d(TAG, "In onsave"); wv.saveState(outState); }

y la próxima vez que la Actividad B se inicie desde la Actividad A,

en oncreate (), hago lo siguiente:

onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); if(savedInstanceState != null){ //restore webview }else { // code } }

Sin embargo, antes de invocar onDestroy en la Actividad B, nunca se llama al método onSaveInstanceState. cualquier ayuda en esto será muy apreciada.

EDITAR: si esto no es posible Por favor, avíseme si hay una forma de almacenar el estado de la vista web


Tenga en cuenta que se llama a onRestoreInstanceState() cuando se recrea la actividad, pero solo si:

fue asesinado por el sistema operativo . "Tal situación sucede cuando:

  • la orientación del dispositivo cambia (su actividad se destruye y recrea)
  • hay otra actividad delante de usted y en algún momento el SO mata su actividad para liberar memoria (por ejemplo). La próxima vez que inicie su actividad onRestoreInstanceState() se llamará ".

Entonces, si usted está en su actividad y presiona el botón Atrás en el dispositivo, su actividad finish() y la próxima vez que inicie su aplicación se inicia nuevamente (parece que volvió a crearse, ¿no?) Pero esto tiempo sin estado guardado porque intencionalmente saliste cuando tocas el botón Atrás.


Tuve una situación similar. Era claramente un error de desarrollo. He anulado el método incorrecto:

public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)

En cambio, una correcta :

protected void onSaveInstanceState(Bundle outState)


Vea el documento aquí: http://developer.android.com/reference/android/app/Activity.html

Tenga en cuenta que es importante guardar los datos persistentes en onPause() lugar de onSaveInstanceState(Bundle) porque este último no forma parte de las devoluciones de llamada del ciclo de vida, por lo que no se onSaveInstanceState(Bundle) en todas las situaciones como se describe en su documentación.

La documentación del método onSaveInstanceState dice:

No confunda este método con las devoluciones de llamada del ciclo de vida de la actividad, como onPause() , que siempre se onPause() cuando una actividad se coloca en segundo plano o en camino a la destrucción, o onStop() que se llama antes de la destrucción. Un ejemplo de cuando se onPause() y onStop() y no a este método cuando un usuario navega desde la actividad B a la actividad A: no hay necesidad de invocar onSaveInstanceState(Bundle) en B porque esa instancia particular nunca se restaurará , por lo que el sistema evita llamarlo. Un ejemplo cuando se llama onPause() y no onSaveInstanceState(Bundle) es cuando se inicia la actividad B frente a la actividad A: el sistema puede evitar llamar onSaveInstanceState(Bundle) en la actividad A si no se onSaveInstanceState(Bundle) durante la vida de B desde el estado de la interfaz de usuario de A permanecerá intacto.

prueba esto:

@Override public void onPause(){ System.out.println("Saving webview state"); Log.d(TAG, "In onsave"); wv.saveState(outState); super.onPause(); } and @Override public void onResume(){ //restore webview }

No estoy seguro de cuál es el propósito de esa declaración if, pero prueba esto y mira lo que sucede.