Android開發:聊聊WebView的使用

twbo5691 7年前發布 | 8K 次閱讀 安卓開發 Android開發 移動開發

前言

盡管WebView是官方提供的控件,但使用使用起來依然是踩坑無數,想要獲得一個較好的用戶體驗更是難上加難。接下來將重點說一下,個人在使用過程中總結出的一些經驗和遇到的問題,希望能夠對大家的開發帶來一些幫助。

基本使用

mWebView.loadUrl(url);

loadUrl() 如果只是單純的想要顯示一個靜態網頁的話,這樣加載就足夠了,但往往開發中,需要許多其他的設置,這就需要用到WebView 的 WebSettings。

WebSettings webSettings = mWebView.getSettings();

網頁的交互是依賴于 JS 的,通過下面設置,可以開啟 H5 網頁的交互功能。

webSettings.setJavaScriptEnabled(true);

關于編譯器會提示警告的問題,可以加入 @SuppressLint(“SetJavaScriptEnabled”) 來避免編譯器的提示。

  1. 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 ,也是為了避免出現安全隱患。

  2. 本地調用網頁JS
    mWebView.loadUrl("javascript:appPayResultQuery()");
    而 appPayResultQuery() 使用網頁提供的JS方法。

基本使用差不多這些就夠了,接下來呢,重點說一下在開發工程中遇到的一些問題及原因,還有相應的解決方案。

使用過程中的問題及解決方案

  1. WebView 與 H5點擊交互時,自動跳轉到瀏覽器加載的問題

    WebView默認是使用第三方或系統默認瀏覽器打開網頁,如果要避免該行為,使網頁用WebView打開,覆蓋該行為即可,如下操作:

    mWebView.setWebViewClient(new WebViewClient(){  
     @Override  
     public boolean shouldOverrideUrlLoading(WebView view, String url) {  
         view.loadUrl(url);  
         return true;  
     }  
    });
  2. 證書引起的相關問題,例如:WebView 加載網頁存在https協議時,證書認證失敗。

    這里提供一種非常暴力的解決方法,如果WebView對于加載的網頁的安全要求并不是很高的話,可以使用該方法。

    mWebView.setWebViewClient(new WebViewClient() {
             @Override
             public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                 handler.proceed();//接受證書
             }
         });
         return view;
  3. 某些網頁在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。

  4. WebView 返回上一頁失敗,可能是當前頁面是由重定向過來的,當返回到上一頁時,又會重新重定向跳轉到該頁。如何解決呢?實際上我們可以通過調用JS來解決。

    webview.loadUrl("javascript:window.history.back();");
  5. 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

 

 本文由用戶 twbo5691 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!