Android Webview总结

作者: 乆丩乣 | 来源:发表于2016-06-03 17:24 被阅读5399次

    这些都是曾经收集到的一些关于Webview的知识,有些工作中用到了,有些暂时还没有用到,这次统一整理下,希望对自己,对大家有所帮助。另外,欢迎大家补充(当然,有错也要指正呀,不胜感激),如果可以的话,我会 更新到本帖中。

    官方文档
    更多知识:)

    一.权限

    <uses-permission android:name="android.permission.INTERNET" />

    二.创建Webview对象

    WebView webview = new WebView(this);

    三.加载网页的方式

    • loadData(String data, String mimeType, String encoding)
      des:Load the given data into the WebView.
      as:
      String summary = "<html><body>You scored <b>192</b> points.</body></html>";
      webview.loadData(summary, "text/html", null);
    • loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
      des:Load the given data into the WebView, use the provided URL as the base URL for the content.
    • loadUrl(String url)
      des:Load the given url.
      as: webView.loadUrl("http://www.jianshu.com/"); //加载网络网页
      webView.loadUrl("file:///android_asset/html/index.html"); //加载本地assert目录下网页
      webView.loadUrl("content://com.Android.htmlfileprovider/sdcard/kris.html"); // 加载SD卡html
    • loadUrl(String url, Map<String, String> extraHeaders)
      Load the given url with the extra headers.
    • postUrl(String url, byte[] postData)
      des: Loads the URL with postData using "POST" method into this WebView.
    • 利用Intent调用系统浏览器
      Uri uri = Uri.parse("http://www.jianshu.com/");
      Intent intent = new Intent(Intent.ACTION_VIEW, uri);
      startActivity(intent);

    四.设置Webview

    webView.clearHistory();
    webView.clearCache(true);
    webView.clearFormData();
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);// 隐藏滚动条webView.requestFocus();
    webView.requestFocusFromTouch();
    

    五.Webview辅助类

    1>WebSettings

    设置WebView的一些属性、状态等,例如允许使用javascript,允许使用缓存,允许使用内置的缩放组件,设置支持IS等。

    • 官方文档
    • 获取WebSettings对象:
      WebSettings mWebSettings = webView.getSettings();
    • For Example
    WebSettings mWebSettings = webView.getSettings();
    mWebSettings.setJavaScriptEnabled(true);// 支持JS
    mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过js打开新的窗口
    mWebSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);//提高渲染等级
    mWebSettings.setBuiltInZoomControls(false);// 设置支持缩放
    mWebSettings.setDomStorageEnabled(true);//使用localStorage则必须打开
    mWebSettings.setBlockNetworkImage(true);// 首先阻塞图片,让图片不显示
    mWebSettings.setBlockNetworkImage(false);//  页面加载好以后,在放开图片:
    mWebSettings.setSupportMultipleWindows(false);// 设置同一个界面
    mWebSettings.setBlockNetworkImage(false);
    mWebSettings.setCacheMode(1);
    mWebSettings.setNeedInitialFocus(false);// 禁止webview上面控件获取焦点(黄色边框)
    
    2>WebViewClient

    主要帮助WebView处理各种通知、请求事件(例如,点击链接时候如何显示界面,页面开始加载,加载完毕之后有何动作等)

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            //页面开始加载时
            super.onPageStarted(view, url, favicon);
        }
        @Override
        public void onPageFinished(WebView view, String url) {
            //页面加载结束时
            super.onPageFinished(view, url);
        }
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
            // 这里进行无网络或错误处理,具体可以根据errorCode的值进行判断,
        }
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            /**
             * 网页跳转:
             * 1.在当前的webview跳转到新连接
             * view.loadUrl(url);
             * 2.调用系统浏览器跳转到新网页
             * Intent i = new Intent(Intent.ACTION_VIEW);
             * i.setData(Uri.parse(url));
             * startActivity(i);
             */
            return true;
        }
    });
    
    3>WebChromeClient

    辅助WebView处理Javascript的对话框、网站图标、网站Title、加载进度等

    webView.setWebChromeClient(new WebChromeClient() {
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            // 获得网页的加载进度 newProgress为当前加载百分比
            super.onProgressChanged(view, newProgress);
        }
        @Override
        public void onReceivedTitle(WebView view, String title) {
            // 获取网页的title,客户端可以在这里动态修改页面的title
            // 另外,当加载错误时title为“找不到该网页”
            super.onReceivedTitle(view, title);
        }
    });
    

    六.与JS交互addJavascriptInterface

    • 前提
    mWebView.getSettings().setJavaScriptEnabled(true);  
    
    • 使用
    mWebView.addJavascriptInterface(new JSInterface(), "jsInterface");  
    JSInterface对象:
    public class JSInterface {
    
        @JavascriptInterface
        public void methodA() {    }
    
        @JavascriptInterface
        public void methodB(String webMessage) {    }
    }
    

    注意:
    1.JavascriptInterface是4.2版本google新增的一个注解,为了避免一个安全隐患,详细信息及4.2以下系统版本适配看这里: Android WebView的Js对象注入漏洞解决方案 ;另外,safe-java-js-webview-bridge这个开源项目完全用onJsPrompt() 替代了addJavaScriptInterface(),有兴趣的可以学习。
    2.JS调用Java:

    window.js_callback.viewPicOnJavascript($('article img').index(this));
    

    3.客户端调用JS

    mWebView.loadUrl("javascript:alert()");
    

    七.键盘

    • webview是否可以返回到上一页面 webView.canGoBack()
    • webview返回到上一页面 webView.goBack();
    • webview是否可以前进 webView.canGoForward()
    • webview前进 webView.goForward();
    public boolean onKeyDown(int keyCode, KeyEvent event) {
         if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
             mWebView.goBack();
             return true;
         }
         return super.onKeyDown(keyCode, event);
     }
    

    八.其他

    • WebViewFragment
      好吧,之前确实不知道有这么个东东,今天写这篇贴子的时候才发现的,看名字,应该是在Fragment里对Webview的封装,应该是个好东西。有兴趣的小伙伴们 点进来:WebViewFragment
    • WebView cookies清理
    CookieSyncManager.createInstance(this);
    CookieSyncManager.getInstance().startSync();
    CookieManager.getInstance().removeSessionCookie();
    
    • 屏蔽长按事件
    webView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            return true;
        }
    });
    
    • Webiew保留缩放功能但是隐藏缩放控件(这是一招必杀技)
    webView.getSettings().setSupportZoom(true);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setDisplayZoomControls(false);
    // setDisplayZoomControls是在Android 3.0中新增的API.,调用此方法前需要对系统版本进行判断
    
    • 判断Webview是否滑动到顶部或底部
    if (webView.getContentHeight() * webView.getScale() == (webView.getHeight() + webView.getScrollY())) {
        // 处于底端
    }
    if(webView.getScrollY() == 0){
        //处于顶部
    }
    des:
    getScrollY() //方法返回的是当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离.
    getHeight()或者getBottom() //方法都返回当前WebView这个容器的高度
    getContentHeight()返回的是整个html的高度,但并不等同于当前整个页面的高度,因为WebView有缩放功能,所以当前整个页面的高度实际上应该是原始html的高度再乘上缩放比例
    

    更多内容请关注 我的专题
    转载请注明 出处:
    http://www.jianshu.com/users/c1b4a5542220/latest_articles

    Thank you and have a nice weekend!

    相关文章

      网友评论

      本文标题:Android Webview总结

      本文链接:https://www.haomeiwen.com/subject/xazkdttx.html