2013-02-27 15 views
6

Ich habe viele Threads durchsucht und finde immer noch keine Antwort auf meine Frage. Ich arbeite an einer Android App, die WebView verwendet.Sichert WebView saveState() JavaScript-Variablen/Umgebung?

Ich benutze onSaveInstanceState() und onRestoreInstanceState() den WebView Zustand wie folgt zu speichern:

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

und

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

ich dies auch in meinem onCreate() haben:

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

Das Problem : Es scheint, dass die Wiederherstellung WebView den Javascript Variablen/Umgebung/Arbeitsbereich überhaupt nicht wiederherstellt. Wenn die App im Hintergrund beendet und dann wiederhergestellt wird, ist das gesamte Javascript mit allen Objekten/Variablen verschwunden. Der Javascript-Code ist mit einem Namen versehen, d. H. window.utilitiesPack, window.eventHandlers, window.automation usw. und sie sind nicht definiert. Auch JQuery und andere Javascript-Plugins werden verwendet: alle scheinen nach dem Wiederherstellungsstatus nicht definiert zu sein. Grundsätzlich wird das gesamte Javascript nicht wiederhergestellt.

Kann jemand bestätigen oder widerlegen, dass es so ist (Javascript wird nicht gespeichert)? Wenn der gesamte Javascript-Arbeitsbereich nicht gespeichert wird, was genau speichert WebView.saveState()? Gibt es eine einfache/elegante Möglichkeit, die vorhandene API zu verwenden, um die JavaScript-Objekte zu erhalten?

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

Update1: So bleibt das Problem bestehen. Die größte Schwierigkeit ist diese:

Ich starte eine Kamera Intent für ein Ergebnis. Wenn das Bild aufgenommen wird, kehrt die App zu WebView Aktivität zurück und soll JavaScript verwenden, um HTML5 LocalStorage mit einigen Datenvariablen zu aktualisieren.

Die Hauptaktivität mit WebView wird beendet, während die Kameraaktivität angezeigt wird. Wenn wir also zu WebView zurückkehren, gibt es kein Javascript mehr und keine Funktionen, die ich von Android-Code aus aufrufen kann. Dies geschieht jedes Mal auf Galaxy S3. Es passiert immer noch auf anderen Telefonen, aber nicht jedes Mal auf Bildaufnahmen.

Ich weiß nicht, was ich hier tun soll. Irgendwie muss ich die Hauptaktivität mit WebView machen, um den Zustand beizubehalten, während das Bild mit der Kamera Absicht gemacht wird. Hat jemand eine Idee, wie dies erreicht werden kann?

+1

"Kann jemand bestätigen oder widerlegen, dass es so ist, wie es wirklich ist" - hast du das nicht einfach bestätigt, indem du es ausprobiert hast und gesehen hast, was passiert ist? – millimoose

+0

(Die Dokumentation scheint zu implizieren, dass das, was gespeichert wird, eine 'WebBackForwardList' ist.) – millimoose

+1

" hast du das nicht einfach bestätigt, indem du es versuchst und zu sehen, dass das tatsächlich passiert? " Ich kann einfach nicht glauben, dass das gesamte Javascript nicht gespeichert wird. Ich hoffe, dass ich etwas nicht verstehe, denn wenn das der Fall ist, ist dies eine Einschränkung für Apps, die Webseiten mit komplexer JavaScript-Funktion verwenden. – user2113581

Antwort

3

Nur sehr wenig Informationen gefunden, nur diese Zeile:

Bitte beachten Sie, dass diese Methode nicht mehr die Anzeigedaten für diese WebView speichert. Das vorherige Verhalten konnte möglicherweise Dateien verlieren, wenn restoreState (Bundle) nie aufgerufen wurde.

und diese Linie:

Gibt die gleiche Kopie der Vor/Zurück-Liste verwendet, um den Zustand zu speichern.

im Javadoc für WebView.saveState(Bundle).

+1

Vielen Dank für Ihre Antwort. Es ist schon eine Weile her, seit ich auf dieses Problem gestoßen bin und deshalb habe ich meine Frage hier vergessen. Ich markiere deine Antwort als richtig, da es so ist. Für diejenigen, die auf dasselbe Problem stoßen: Die Art und Weise, wie ich es gelöst habe, besteht darin, webView im Kontext von App zu definieren, anstatt im Kontext von Activity. Jetzt funktioniert alles wie erwartet. Das einzige Problem bei diesem Ansatz ist, dass Sie onJsAlert() und onJsConfirm() überschreiben müssen, damit alert()/confirm() funktioniert. Auch die