¿WebView saveState () preserva variables / entorno de JavaScript?

He buscado muchos hilos y todavía no puedo encontrar la respuesta a mi pregunta. Estoy trabajando en una aplicación para Android que utiliza WebView .

Utilizo onSaveInstanceState() y onRestoreInstanceState() para guardar el estado de WebView como esto:

 @Override public void onSaveInstanceState(Bundle savedInstanceState) { webView.saveState(savedInstanceState); } 

y

 @Override public void onRestoreInstanceState(Bundle savedInstanceState) { webView.restoreState(savedInstanceState); } 

También tengo esto en mi onCreate() :

 public void onCreate(Bundle savedInstanceState) { ... other code ... if(savedInstanceState != null){ webView.saveState(savedInstanceState); }else{ webView.loadUrl("http://mypage"); } } 

El problema: Parece que la restauración de WebView no restaura las variables Javascript / entorno / espacio de trabajo en absoluto. Cuando se cancela la aplicación en segundo plano y luego se restaura, todo el Javascript se ha ido con todos los objetos / variables. El código javascript es espaciado por el nombre, es decir, window.eventHandlers , window.automation , window.automation , etc y no están definidos. También se utilizan JQuery y otros complementos javascript: todos parecen estar indefinidos después del estado de restauración. Básicamente todo el Javascript no es restaurado.

¿Puede alguien confirmar o refutar que esto es lo que realmente es (Javascript no guardado)? Si no se guarda todo el espacio de trabajo Javascript, ¿qué es lo que hace exactamente WebView.saveState() ? ¿Existe alguna manera sencilla y elegante de usar la API existente para preservar los objetos Javascript?

// ================================================ ======

Update1: Así que el problema sigue siendo. La dificultad más significativa es esta:

Estoy lanzando un Intent cámara para obtener un resultado. Cuando se toma la foto, la aplicación vuelve a la actividad de WebView y se supone que utiliza Javascript para actualizar HTML5 LocalStorage con algunas variables de datos.

La Actividad principal con WebView se WebView mientras se muestra la Actividad de cámara, por lo que cuando volvemos a WebView, ya no hay Javascript y no hay funciones que pueda llamar desde el código de Android. Esto ocurre cada vez en el Galaxy S3 . Todavía sucede en otros teléfonos, pero no cada vez en la toma de la imagen.

No sé qué hacer aquí. De alguna manera debo hacer la actividad principal con WebView para retener el estado mientras la imagen se está tomando con la intención de la cámara. ¿Alguien tiene una idea de cómo se puede lograr esto?

Muy poca información encontrada, sólo esta línea:

Tenga en cuenta que este método ya no almacena los datos de visualización para este WebView. El comportamiento anterior podría potencialmente vaciar archivos si restoreState (Bundle) nunca se llamó.

Y esta línea:

Devuelve la misma copia de la lista anterior / posterior utilizada para guardar el estado.

En el javadoc para WebView.saveState(Bundle) .

Como user2113581 comentó, mover el WebView en un contexto de la aplicación en lugar de la actividad es una solución potencial. Esto todavía tiene todas las trampas que user2113581 mencionó, incluyendo <select> no funciona (porque crea una ventana, pero un contexto de aplicación no tiene un token de ventana).

He extendido mi aplicación para administrar mi webview …

MyApplication.java:

 public class MyApplication extends Application { private WebView mWebView; private boolean mWebViewInitialized; // ... @Override public void onCreate() { super.onCreate(); mWebView = new WebView(this); mWebViewInitialized = false; // we do some initialization once in our activity. } public WebView getWebView() { return mWebView; } public boolean isWebViewInitialized() { return mWebViewInitialized; } public void setWebViewInitialized(boolean initialized) { mWebViewInitialized = initialized; } } 

En nuestra actividad:

 @Override protected void onCreate(Bundle savedInstanceState) { // ... MyApplication app = (MyApplication) getApplication(); mWebView = app.getWebView(); if (!app.isWebViewInitialized()) { /* first time initialization */ app.setWebViewInitialized(true); } } 

Finalmente, en su Actividad, deseará agregar el mWebView a una vista de contenedor (FrameLayout, o similar) durante un evento de ciclo de vida que tenga sentido. Deberá eliminarlo del contenedor cuando la actividad se esté deteniendo o detenida. He utilizado onResume y onPause con buenos resultados.

  • ¿Cómo ver / depurar los encabezados de solicitud no estándar que el navegador de mi teléfono está enviando?
  • Espacios en blanco usando la vista web de android dentro de scrollview con una red móvil de jQuery
  • Las cookies no se almacenan en la API de Webview android 21 y superiores
  • El controlador onScaleChanged de WebView se llama varias veces
  • Viewport ajusta el ancho de la pantalla y las grandes imágenes
  • Cómo obtener la actividad de vista Web para desaparecer con PDF Link Action_view
  • Vista web de Android, inicie la actividad ACTION_VIEW cuando la URL no pueda ser manejada por webview
  • Cómo llamar al método Javascript desde la vista web en Android
  • LinearLayout de un WebView y un botón
  • WebView con cliente HTTP personalizado
  • Vista web de android que muestra la página en blanco
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.