software - ¿WebView saveState() conserva variables/entorno de Javascript?
web view android (2)
Como comentó user2113581, mover la WebView a un contexto de la aplicación en lugar de la Actividad es una solución potencial. Esto todavía tiene todos los inconvenientes que mencionó el usuario2113581, incluido <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 vista web ...
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, querrá agregar mWebView
a una vista de contenedor (FrameLayout, o similar) durante un evento de ciclo de vida que tenga sentido. Tendrá que eliminarlo del contenedor cuando la actividad se detenga o se detenga. He usado onResume
y onPause
con buenos resultados.
He buscado muchos hilos y todavía no puedo encontrar la respuesta a mi pregunta. Estoy trabajando en una aplicación de Android
que usa WebView
.
Yo uso onSaveInstanceState()
y onRestoreInstanceState()
para guardar el estado de WebView
así:
@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 / entorno / espacio de trabajo de Javascript
en absoluto. Cuando se mata 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 está espaciado de nombre, es decir, window.eventHandlers
, window.automation
, window.automation
, etc. y no están definidos. También se utilizan JQuery
y otros complementos de JavaScript: todos parecen estar indefinidos después del estado de restauración. Básicamente, no se restaura todo el Javascript.
¿Alguien puede confirmar o refutar que así es como es (Javascript no se guardó)? Si no se guarda todo el espacio de trabajo de Javascript, ¿qué WebView.saveState()
exactamente WebView.saveState()
? ¿Existe alguna manera fácil / elegante de usar la API existente para preservar los objetos de JavaScript?
// ============================================= ======
Actualización1: Entonces el problema permanece. La dificultad más significativa es esta:
Estoy lanzando un Intent
cámara por un resultado. Cuando se toma una foto, la aplicación vuelve a la actividad de WebView
y se supone que usa Javascript para actualizar HTML5 LocalStorage
con algunas variables de datos.
La Actividad principal con WebView
se WebView
cuando se muestra la Actividad de la cámara, por lo que cuando volvemos a WebView, ya no hay JavaScript y no hay funciones a las que pueda llamar desde el código de Android. Esto sucede cada vez en Galaxy S3
. Todavía sucede en otros teléfonos, pero no siempre en la toma de fotografías.
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 el Intento de la cámara. ¿Alguien tiene una idea de cómo se puede lograr esto?
Se encontró muy poca información, solo 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 perder archivos si nunca se llamó a restoreState (Bundle).
y esta línea:
Devuelve la misma copia de la lista de atrás / adelante utilizada para guardar el estado.
en el javadoc para WebView.saveState(Bundle)
.