先看看效果圖吧
實現比較簡單,但是第一次用可能會遇到一些坑
首先得有Webview控件:
有人問我是不是需要寫布局文件,不寫行不行,現在我就告訴你們,不寫沒問題,需要寫就寫不寫直接創建New一個也行。 下面我就介紹一個,我new一個Webview實現localStorage。
WebView mywebView = new WebView(this);
mywebView.getSettings().setJavaScriptEnabled(true);
mywebView.getSettings().setDomStorageEnabled(true);// 打開本地緩存提供JS調用,至關重要
mywebView.getSettings().setAppCacheMaxSize(1024 * 1024 * 8);// 實現8倍緩存
mywebView.getSettings().setAllowFileAccess(true);
mywebView.getSettings().setAppCacheEnabled(true);
String appCachePath = getApplication().getCacheDir().getAbsolutePath();
mywebView.getSettings().setAppCachePath(appCachePath);
mywebView.getSettings().setDatabaseEnabled(true);
上面這些settings是實現localStorage需要的存儲條件。
其次就是如何實現localStorage本地存儲了:
其實我在網上搜索了很多比如這樣:
String userAgent = "shixinzhang";
String js = "window.localStorage.setItem('userAgent','" + userAgent + "');";
String jsUrl = "javascript:(function({
var localStorage = window.localStorage;
localStorage.setItem('userAgent','" + userAgent + "')
})()";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mWebView.evaluateJavascript(js, null);
} else {
mWebView.loadUrl(jsUrl);
mWebView.reload();
}
這里就會出現很多坑了,當然我也踩過比如你直接將該代碼復制到settings下面,直接運行你會發現你存不進去反而出現報錯, 你會發現提示Window找不到localStorage屬性,怎么都存不進去。不是說上面代碼寫的是錯誤的,而是這樣寫的確有問題, 因為Webview瀏覽器並未打開找不到localStorage,所以要想解決這個問題就得先打開Android的Webview瀏覽器才能找到localStorage。 關於上面代碼如果想用可以提供一種解決方案,那就是將上面代碼寫在onPageFinished里:
mywebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
String userAgent = "shixinzhang";
String js = "window.localStorage.setItem('userAgent','" + userAgent + "');";
String jsUrl = "javascript:(function({
var localStorage = window.localStorage;
localStorage.setItem('userAgent','" + userAgent + "')
})()";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
view.evaluateJavascript(js, null);
} else {
view.loadUrl(jsUrl);
view.reload();
}
}
});
當然這種寫法前提是最外層你得有:mywebView.loadUrl("地址"); 我覺得這樣寫除非在你已經有路徑可寫的情況下這樣可以,但是沒有的話就乖乖的寫一個吧,localStorage也寫在Html里面。
在javaScript.html文件實現localStorage數據存儲:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
function saveData(param){
<!--console.log("android調用此方法=====>saveData");-->
localStorage.setItem("userAgent",param,true);
console.log("android調用此方法=====>getData==="+localStorage.getItem("userAgent"));
window.android.getUserKey(localStorage.getItem("userAgent"));
}
</script>
</head>
</html>
當然我在這里也寫了Js回調,不熟悉的可以參考一下:window.android.getUserKey(localStorage.getItem("userAgent"));
剩下就是如何調用該Html了:
mywebView.loadUrl("file:///android_asset/javascript.html");
mywebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
view.loadUrl("javascript:saveData('123')");
}
});
注意:view.loadUrl("javascript:saveData('123')");一定要在onPageFinished之后執行,因為瀏覽器加載完成這之后才能找到localStorage屬性,因為這個是瀏覽器攜帶的屬性。
當然JS回調我也給你們寫出來:
mywebView.addJavascriptInterface(new AppClass(getBaseContext()), "android");
private class AppClass { private Context c; public AppClass(Context baseContext) { this.c = baseContext; } @JavascriptInterface public void getUserKey(String userKey) { Toast.makeText(c, userKey + "", Toast.LENGTH_SHORT).show(); Log.e("Tag", "讀取到userKey : " + userKey); } }
源碼