¿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?

2 Solutions collect form web for “¿WebView saveState () preserva variables / entorno de JavaScript?”

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.

  • Añadir indicador de carga / barra de progreso a Phonegap Pantalla de bienvenida de Android
  • WebView saltar para anclar utilizando loadDataWithBaseUrl
  • Android: "onBackPressed" sólo se llama desde la primera página de Cordova 3 webview, no se puede anular desde páginas interiores
  • Problema de renderizado de WebView en Android KitKat
  • Android carga los datos html en las pestañas personalizadas de cromo
  • Android WebView Facebook Login (problemas de pop-up / redirección)
  • Android WebView Reproducción de vídeo HTML5 / h.264 / mp4, Cómo llegar a MediaPlayer
  • Configuración correcta de AppCache para Android WebView
  • Android crea documento pdf desde webview con varias páginas
  • Determinar la implementación de WebView (System WebView o Chrome) en Android 7
  • Restaurar historial y página actual al reanudar la visualización web
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.