首页 > 技术文章 > 安卓 WebView

zhen-android 2018-01-07 21:27 原文

WebView是一个基于webkit引擎、展现web页面的控件。

代码部分

实例:

         mWebView = (WebView)findViewById(R.id.wv_test_view);

        // 在当前activity打开而不是在浏览器打开

        mWebView.setWebViewClient(new WebViewClient());

 

        // Enable Javascript

        WebSettings webSettings = mWebView.getSettings();

        webSettings.setJavaScriptEnabled(true);

 

        String  url = "http://www.utovr.com/";

        mWebView.loadUrl(url);

 

WebChromeClient

// 调用浏览器

         mWebView = (WebView) findViewById(R.id.wv_chrome);

 

        mWebView.setWebChromeClient(new WebChromeClient(){

            @Override

            public void onProgressChanged(WebView view, int newProgress) {

                super.onProgressChanged(view, newProgress);

            }

        });

 

        // Enable Javascript

        WebSettings webSettings = mWebView.getSettings();

        webSettings.setJavaScriptEnabled(true);

 

        String url = "https://www.sogou.com/";

        mWebView.loadUrl(url);

WebView主要API:

// WebView相关类

        WebSettings、WebViewClient、WebChromeClient

// 前进/后退

        // 是否可以后退

        mWebView.canGoBack();

        // 后退网页

        mWebView.goBack();

        // 是否可以前进                    

        mWebView.canGoForward();

        // 前进网页

        mWebView.goForward();

        // 以当前的index为起始点前进或者后退到历史记录中指定的steps

        // 如果steps为负数则为后退,正数则为前进

        mWebView.goBackOrForward(steps);

// 设置滚动条

        // 设置滚动条

        mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);

// 清除缓存数据

        // 清除网页访问留下的缓存

        // 由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序

        mWebView.clearCache(true);

        // 清除当前webview访问的历史记录

        // 只会webview访问历史记录里的所有记录除了当前访问记录

        mWebView.clearHistory();

        // 这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据

        mWebView.clearFormData();

// 三种加载方式

        // 1.加载远程资源

        mWebView.loadUrl("https://www.baidu.com/");

        // 2.加载本地资源,工程放在assets目录

        mWebView.loadUrl("file:///android_asset/WebClientTest/www/index.html");

        // 3.加载手机本地的html页面

        mWebView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");  

 

WebSettings

        // Enable Javascript

        WebSettings webSettings = mWebView.getSettings();

        webSettings.setJavaScriptEnabled(true);

 

 

        //设置自适应屏幕,两者合用

        webSettings.setUseWideViewPort(true); // 将图片调整到适合webview的大小

        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

 

        //缩放操作

        webSettings.setSupportZoom(true);   // 支持缩放,默认为true。是下面那个的前提。

        webSettings.setBuiltInZoomControls(true); // 设置内置的缩放控件。若为false,则该WebView不可缩放

        webSettings.setDisplayZoomControls(false);  // 隐藏原生的缩放控件

        //其他细节操作

        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  // 关闭webview中缓存

        webSettings.setAllowFileAccess(true);   //设置可以访问文件

        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); // 支持通过JS打开新窗口

        webSettings.setLoadsImagesAutomatically(true);  // 支持自动加载图片

        webSettings.setDefaultTextEncodingName("utf-8");// 设置编码格式

        // 设置缓存

        webSettings.setAppCacheEnabled();

        webSettings.setAppCachePath();

        webSettings.setAppCacheMaxSize();

        webSettings.setCacheMode();

 

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 onLoadResource(WebView view, String url) {

        super.onLoadResource(view, url);

    }

 

    /**

     */

    @Override

    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        return super.shouldOverrideUrlLoading(view, url);

    }

 

    @Override

    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

        return super.shouldOverrideUrlLoading(view, request);

    }

 

    /**

     * 可以在此重载资源文件

     */

    @Override

    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {

        return super.shouldInterceptRequest(view, url);

    }

 

    @Override

    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

        return super.shouldInterceptRequest(view, request);

    }

 

    /**

     * 页面加载错误事调用

     */

    @Override

    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {

        super.onReceivedError(view, request, error);

    }

 

 

WebViewFullActivity
/**
 * WebView全特性测试
 *  http://blog.csdn.net/carson_ho/article/details/52693322
 */
public class WebViewFullActivity extends AppCompatActivity {

    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view_full);
        mWebView = (WebView) findViewById(R.id.wv_test);

        mWebView.setWebViewClient(new WebViewClient());

        // 设置滚动条
        mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);

        // Enable Javascript
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);


        // 设置自适应屏幕,两者合用
        webSettings.setUseWideViewPort(true); // 将图片调整到适合webview的大小
        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

        // 缩放操作
        webSettings.setSupportZoom(true);   // 支持缩放,默认为true。是下面那个的前提。
        webSettings.setBuiltInZoomControls(true);   // 设置内置的缩放控件。若为false,则该WebView不可缩放
        webSettings.setDisplayZoomControls(false);  // 隐藏原生的缩放控件

        // 其他细节操作
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  // 关闭webview中缓存
        webSettings.setAllowFileAccess(true);   //设置可以访问文件
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); // 支持通过JS打开新窗口
        webSettings.setLoadsImagesAutomatically(true);  // 支持自动加载图片
        webSettings.setDefaultTextEncodingName("utf-8");// 设置编码格式

//        // 设置缓存
//        webSettings.setAppCacheEnabled();
//        webSettings.setAppCachePath();
//        webSettings.setAppCacheMaxSize();
//        webSettings.setCacheMode();

//        // 1.加载远程资源
//        mWebView.loadUrl("https://www.baidu.com/");
//
//        // 2.加载本地资源,工程放在assets目录
//        mWebView.loadUrl("file:///android_asset/WebClientTest/www/index.html");
//
//        // 3.加载手机本地的html页面
//        mWebView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");

        String url = "https://www.sogou.com/";
        mWebView.loadUrl(url);

        mWebView.getProgress();
    }

    /**
     * 返回事件处理
     */
    @Override
    public void onBackPressed() {
        if (mWebView.canGoBack()) {
            mWebView.goBack();
        } else {
            super.onBackPressed();
        }

//        // 是否可以后退
//        mWebView.canGoBack();
//        // 后退网页
//        mWebView.goBack();
//
//        // 是否可以前进
//        mWebView.canGoForward();
//        // 前进网页
//        mWebView.goForward();
//
//        // 以当前的index为起始点前进或者后退到历史记录中指定的steps
//        // 如果steps为负数则为后退,正数则为前进
//        mWebView.goBackOrForward(steps);
    }

    @Override
    protected void onDestroy() {

//        // 清除网页访问留下的缓存
//        // 由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.
//        mWebView.clearCache(true);
//
//        // 清除当前webview访问的历史记录
//        // 只会webview访问历史记录里的所有记录除了当前访问记录
//        mWebView.clearHistory();
//
//        // 这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据
//        mWebView.clearFormData();

        RelativeLayout pView = (RelativeLayout) mWebView.getParent();
        pView.removeView(mWebView);
        mWebView.destroy();
        super.onDestroy();
    }
}

  

WebViewClientSuper
public class WebViewClientSuper extends WebViewClient {
    /**
     * 页面载入时调用
     * @param view
     * @param url
     * @param favicon
     */
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
    }

    /**
     * 页面加载完成调用
     * @param view
     * @param url
     */
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
    }

    /**
     * 加载页面资源时会调用
     *  可以在此重载页面,劫持页面
     * @param view
     * @param url
     */
    @Override
    public void onLoadResource(WebView view, String url) {
        super.onLoadResource(view, url);
    }

    /**
     *
     * @param view
     * @param url
     * @return
     */
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return super.shouldOverrideUrlLoading(view, url);
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        return super.shouldOverrideUrlLoading(view, request);
    }

    /**
     * 可以在此重载资源文件
     * @param view
     * @param url
     * @return
     */
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
        return super.shouldInterceptRequest(view, url);
    }

    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        return super.shouldInterceptRequest(view, request);
    }

    /**
     * 页面加载错误事调用
     * @param view
     * @param request
     * @param error
     */
    @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
        super.onReceivedError(view, request, error);
    }
}

  

参考文档:

博客地址

     https://developer.android.com/reference/android/webkit/WebView.html

     Android:最全面的 Webview 详解

     Android WebView常见问题及解决方案汇总

     android WebView全面总结

 

开源项目

     https://github.com/search?utf8=%E2%9C%93&q=android+webview&type=

     https://github.com/yale8848/CacheWebView

     https://github.com/Tencent/VasSonic

 

测试地址

     http://www.utovr.com/

推荐阅读