Android開發:聊聊WebView的使用
前言
盡管WebView是官方提供的控件,但使用使用起來依然是踩坑無數,想要獲得一個較好的用戶體驗更是難上加難。接下來將重點說一下,個人在使用過程中總結出的一些經驗和遇到的問題,希望能夠對大家的開發帶來一些幫助。
基本使用
mWebView.loadUrl(url);
loadUrl() 如果只是單純的想要顯示一個靜態網頁的話,這樣加載就足夠了,但往往開發中,需要許多其他的設置,這就需要用到WebView 的 WebSettings。
WebSettings webSettings = mWebView.getSettings();
網頁的交互是依賴于 JS 的,通過下面設置,可以開啟 H5 網頁的交互功能。
webSettings.setJavaScriptEnabled(true);
關于編譯器會提示警告的問題,可以加入 @SuppressLint(“SetJavaScriptEnabled”) 來避免編譯器的提示。
-
JS 與本地交互
mWebView.addJavascriptInterface(new JavaScriptInterface(this), "android");
將 對象注入到WebView 中,WebView 加載的網頁均可調用該對象中的方法。"android" 為對象名。下面看一下對象的具體實現。
// 網頁調動js方法 final class JavaScriptInterface { public JavaScriptInterface() { } @JavascriptInterface public void appRedirect(String url) { // 具體操作 } }
Android 從API17之后,提供注解 @JavascriptInterface ,也是為了避免出現安全隱患。
- 本地調用網頁JS
mWebView.loadUrl("javascript:appPayResultQuery()");
基本使用差不多這些就夠了,接下來呢,重點說一下在開發工程中遇到的一些問題及原因,還有相應的解決方案。
使用過程中的問題及解決方案
-
WebView 與 H5點擊交互時,自動跳轉到瀏覽器加載的問題
WebView默認是使用第三方或系統默認瀏覽器打開網頁,如果要避免該行為,使網頁用WebView打開,覆蓋該行為即可,如下操作:
mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } });
-
證書引起的相關問題,例如:WebView 加載網頁存在https協議時,證書認證失敗。
這里提供一種非常暴力的解決方法,如果WebView對于加載的網頁的安全要求并不是很高的話,可以使用該方法。
mWebView.setWebViewClient(new WebViewClient() { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed();//接受證書 } }); return view;
-
某些網頁在Android 5.0及其以上的版本加載成功,圖片卻無法顯示的問題,遇到這種情況的原因可能有很多,這里說一下我在遇到這種情況時的原因:該網頁是https協議,而加載的圖片是 http協議。解決方法呢,也簡單:
private void setMinedContentMode(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } }
該方法的解釋是:
當一個安全的來源(origin)試圖從一個不安全的來源加載資源時配置WebView的行為。默認情況下,KITKAT及更低版本默認值為MIXED_CONTENT_ALWAYS_ALLOW,LOLLIPOP版本默認值MIXED_CONTENT_NEVER_ALLOW,WebView首選的最安全的操作模式為MIXED_CONTENT_NEVER_ALLOW ,不鼓勵使用MIXED_CONTENT_ALWAYS_ALLOW。
-
WebView 返回上一頁失敗,可能是當前頁面是由重定向過來的,當返回到上一頁時,又會重新重定向跳轉到該頁。如何解決呢?實際上我們可以通過調用JS來解決。
webview.loadUrl("javascript:window.history.back();");
-
WebView 播放視頻的問題,當你播放了視頻之后,返回上一界面,或者跳轉到其他頁面,你會發現,播放的視頻聲音還在播放。
原因就是 WebView threads never stop!
解決方法也很簡單,在相應的生命周期中,對 WebView 進行相關的處理。由于WebView 本身占用著很多資源,當它離開屏幕的時候,也應該釋放其占有的 CPU ,網絡資源。
private void destroyWebView() { // if (mWebView != null) { mWebView.removeAllViews(); mWebView.destroy(); mWebView = null; } } private void pauseWebView() { // if (mWebView == null) { return; } mWebView.onPause(); } private void resumeWebView() { // if (mWebView == null) { return; } mWebView.onResume(); }
WebView 也提供了相應的方法,我們只需要在相應的生命周期中調用即可。
總結
關于WebView的使用就說這么多,關于其他的拓展就留給大家去解決吧。如果有什么不對的地方請大家指出,或者有更好地解決方法,也請留言討論吧。
來自:http://www.jianshu.com/p/f4e73b864f6c