webView.setWebViewClient(new WebClient());
storageBackup = new LocalStorageCopier(someContext, someId);
webView.addJavascriptInterface(storageBackup, "backup");
webView.loadUrl (someUrl);
注: javascriptのインタフェースをロードする前に追加されていることが重要ですページ。私はこのビットをURLをロードする前に移動するまで(私はバックアップを実行する直前に追加していた)、なぜ "バックアップが未定義である"のかについて頭を悩ましていました。
バックアップバックアップとの復元アクションを結びつけるだけで済みます。
バックアップ:上記のとおり、メソッドは、このようなものをバックアップするのに適しています。あなたの内の適切な場所に以下のコードを追加します。BACKUP_JAVASCRIPT
は"(function() { console.log('backing up'); backup.clear(); for (var key in localStorage) { backup.set(key, localStorage.getItem(key)); }})()"
ある場合、すべての時間があなたの活動が一時停止されている
webView.evaluateJavascript(BACKUP_JAVASCRIPT, new ValueCallback<String>() {
@Override public void onReceiveValue(String s) {
LOG.d("Backed up.");
}
});
をだから今、あなたのlocalStorage
がバックアップされます。
復元は非常によく似た方法で行われます。ページがロードされた後にリストア・アクションを開始する必要があります。これは、WebClient
クラス(下のコード)が入る場所です。ページの読み込みが完了したら、LocalStorageCopier
インスタンス内のすべてのアイテムを取得してlocalStorage
に配置する必要があります。RESTORE_JAVASCRIPT
のためのjavascriptは次のとおりです。LocalStorageCopier "(function(){console.log('Restoring'); backup.dump(); var len = backup.size(); for (i = 0; i < len; i++) { var key = backup.key(i); console.log(key); localStorage.setItem(key, backup.get(key));}})()"
public static class LocalStorageCopier {
private final SharedPreferences store;
private String[] keys = null;
private String[] values = null;
private boolean dumped = false;
LocalStorageCopier(final Context context, final String id) {
store = context.getSharedPreferences(id, Context.MODE_PRIVATE);
}
@JavascriptInterface
public synchronized void dump() {
if (dumped) throw new IllegalStateException("already dumped");
final Map<String, ?> map = store.getAll();
final int size = map.size();
keys = new String[size];
values = new String[size];
int cur = 0;
for (final String key : map.keySet()) {
keys[cur] = key;
values[cur] = (String) map.get(key);
++cur;
}
dumped = true;
}
@JavascriptInterface
public synchronized int size() {
if (!dumped) throw new IllegalStateException("dump() first");
return keys.length;
}
@JavascriptInterface
public synchronized String key(final int i) {
if (!dumped) throw new IllegalStateException("dump() first");
return keys[i];
}
@JavascriptInterface
public synchronized String value(final int i) {
if (!dumped) throw new IllegalStateException("dump() first");
return values[i];
}
@JavascriptInterface
public synchronized String get(final String key) {
return store.getString(key, null);
}
@JavascriptInterface
public synchronized void set(final String key, final String value) {
if (dumped) throw new IllegalStateException("already dumped");
store.edit().putString(key, value).apply();
}
@JavascriptInterface
public synchronized void clear() {
store.edit().clear().apply();
keys = null;
values = null;
dumped = false;
}
@Override public synchronized String toString() {
return store.getAll().toString();
}
}
のWebClient
class WebClient extends WebViewClient {
@Override public void onPageFinished(WebView view, String url) {
LOG.d("Page finished. Restoring storage.");
view.evaluateJavascript(RESTORE_JAVASCRIPT, new ValueCallback<String>() {
@Override public void onReceiveValue(String s) {
LOG.d("Restored.");
}
});
super.onPageFinished(view, url);
}
}
onPause同期に問題がいくつかあります:メインスレッド2にIOのタスクをブロック1- - 古いファイルを新しいファイルに置き換えるのではなく、2つのファイルをマージする必要があります。 – copolii