由于前段時(shí)間的項(xiàng)目對(duì)WebView的使用較多,因此總結(jié)一下項(xiàng)目中WebView的使用使用過(guò)程,以及一些值得注意的地方
WebView 在大部分的WebApp中使用相當(dāng)廣泛,處理好WebView也是一個(gè)WebApp的關(guān)鍵
目前的WebView是基于webkit 內(nèi)核瀏覽器并且封裝在android 的sdk 當(dāng)中,并且WebView包括以下幾個(gè)功能
- 加載網(wǎng)站url和加載本地html頁(yè)面
- 可以與JavaScript代碼進(jìn)行交互
- webview控件可以高度進(jìn)行定制
在WebView使用過(guò)程中應(yīng)當(dāng)注意一下幾點(diǎn):
在AndroidManifest.xml 中添加網(wǎng)絡(luò)訪問(wèn)權(quán)限
<uses-permission android:name="android.permission.INTERNET" />
在WebView中有一個(gè)輔助類WebSettings,通過(guò)他管理WebView的一些狀態(tài)以及插件
// webview啟用javascript支持 用于訪問(wèn)頁(yè)面中的javascript
webSettings.setJavaScriptEnabled(true);
//設(shè)置WebView緩存模式 默認(rèn)斷網(wǎng)情況下不緩存
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
//斷網(wǎng)情況下加載本地緩存
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);}
//讓W(xué)ebView支持DOM storage API
webSettings.setDomStorageEnabled(true);
//讓W(xué)ebView支持縮放
webSettings.setSupportZoom(true);
//啟用WebView內(nèi)置縮放功能
webSettings.setBuiltInZoomControls(true);
//讓W(xué)ebView支持可任意比例縮放
webSettings.setUseWideViewPort(true);
//讓W(xué)ebView支持播放插件
webSettings.setPluginState(WebSettings.PluginState.ON);
//設(shè)置WebView使用內(nèi)置縮放機(jī)制時(shí),是否展現(xiàn)在屏幕縮放控件上
webSettings.setDisplayZoomControls(false);
//設(shè)置在WebView內(nèi)部是否允許訪問(wèn)文件
webSettings.setAllowFileAccess(true);
//設(shè)置WebView的訪問(wèn)UserAgent
webSettings.setUserAgentString(WebViewUtil.getUserAgent(getActivity(), webSettings));
//設(shè)置腳本是否允許自動(dòng)打開(kāi)彈窗
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
// 加快HTML網(wǎng)頁(yè)加載完成速度
if (Build.VERSION.SDK_INT >= 19) {
settings.setLoadsImagesAutomatically(true);
} else {
settings.setLoadsImagesAutomatically(false);
}
// 開(kāi)啟Application H5 Caches 功能
settings.setAppCacheEnabled(true);
// 設(shè)置編碼格式
settings.setDefaultTextEncodingName("utf-8");
3.當(dāng)頁(yè)面需要調(diào)用我們一些原生native的功能時(shí)候,可以通過(guò)我們自定義的JS接口去實(shí)現(xiàn)
//設(shè)置WebView JavaScript接口可以供頁(yè)面JS調(diào)用
mWebView.addJavascriptInterface(new JsInterface(), AppUtil.KEY_JS_INTERFACE_NAME);
通過(guò)下面定義接口中的方法,如果涉及到一些ui界面上的處理和操作的話,需要在主線程中進(jìn)行
//接口類
public class JsInterface {
public JsInterface() {
@JavascriptInterface
public void showToast(String msg, int delayType) {
Message message = new Message();
message.what = SHOW_TOAST;
message.arg1 = delayType;
message.obj = msg;mHandler.sendMessage(message);
}
}
}
4.設(shè)定WebViewClient和WebChromeClient實(shí)現(xiàn)WebView更多功能
通過(guò)設(shè)置WebViewClient獲取頁(yè)面標(biāo)題與頁(yè)面中連接跳轉(zhuǎn)的處理
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
//可以獲取到WebView的標(biāo)題Title
setTitle(view.getTitle());
super.onPageFinished(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//WebVeiw中連接跳轉(zhuǎn)進(jìn)行處理跳轉(zhuǎn)到新的Activity
if (WebIntentUtil.isDetailsPage(url)) {
Intent intent = new Intent(EmbeddedBrowserActivity.this, DetailsActivity.class);
intent.putExtra(BbsServerUtil.KEY_URL, url);
startActivity(intent);
return true;
} else {
return super.shouldOverrideUrlLoading(view, url);
}
}
});