Android 开发:(十二)WebView篇

一、WebView 简介:

官方 WebView.html

A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit rendering engine to display web pages and includes methods to navigate forward and backward through a history, zoom in and out, perform text searches and more.

WebView 是一个用来显示 Web 网页的控件,继承自 AbsoluteLayout,和使用系统其他控件没什么区别,只是 WeView 控件方法比较多比较丰富。因为它就是一个微型浏览器,包含一个浏览器该有的基本功能,例如:滚动、缩放、前进、后退下一页、搜索、执行 Js等功能。

二、基本使用:

1. 一般使用三大属性(WebSettings、WebViewClient、WebChromeClient)进行处理web view与js、通知、进度条等一系列事件的交互处理;
1.1. WebSettings:自适应屏幕、缩放、js交互等;
1.2.WebViewClient:帮助WebView处理各种通知、请求事件

常用方法:
shouldOverrideUrlLoading(); //拦截一些URL,做处理;
onPageStarted(); // 开始加载
onPageFinished(); //结束加载
onReceivedError(); //返回错误

1.3.WebChromeClient: 辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度。

onJsAlert();
onReceivedTitle();
onReceivedIcon();
onProgressChanged();

2.代码示例:
2.1. xml布局

Android 开发:(十二)WebView篇

    <ProgressBar
        android:id="@+id/shopping_progressbar"
        android:layout_width="match_parent"
        android:layout_height="3dp"
        android:layout_below="@+id/shopping_actionBar"
        android:background="@color/text_yellow"
        android:max="100"
        android:progress="0"
        android:visibility="gone" />

    <WebView
        android:id="@+id/shopping_webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/shopping_progressbar"/>
2.2. activity调用:

Android 开发:(十二)WebView篇

Android 开发:(十二)WebView篇

Android 开发:(十二)WebView篇


public class Discover_ShoppingActivity extends AppCompatActivity {

    private NavigationBar navigationBar;
    private WebView webView;
    private ProgressBar progressBar;

    @SuppressLint("JavascriptInterface")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_discover_shopping);
        navigationBar = findViewById(R.id.shopping_actionBar);
        navigationBar.setLeftImage(R.mipmap.back_icon);
        progressBar = findViewById(R.id.shopping_progressbar);
        webView = findViewById(R.id.shopping_webview);
        webView.loadUrl("https://www.jianshu.com/u/524c283ebbff");


        WebSettings webSettings = webView.getSettings();
        //允许使用js
        webSettings.setJavaScriptEnabled(true);
        //设置自适应屏幕,两者合用
        webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
        //支持屏幕缩放
        webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
        webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
        webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件

        webView.setWebViewClient(webViewClient);
        webView.setWebChromeClient(webChromeClient);
    }


    //WebViewClient帮助WebView处理各种通知、请求事件
    private WebViewClient webViewClient = new WebViewClient() {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

            return super.shouldOverrideUrlLoading(view, request);
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            progressBar.setVisibility(View.VISIBLE);
        }


        @Override
        public void onPageFinished(WebView view, String url) {
            progressBar.setVisibility(View.GONE);
        }


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

        }

    };

    //WebChromeClient辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度
    private WebChromeClient webChromeClient = new WebChromeClient() {

        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {

            AlertDialog.Builder localBuilder = new AlertDialog.Builder(webView.getContext());
            localBuilder.setMessage(message).setPositiveButton("确定", null);
            localBuilder.setCancelable(false);
            localBuilder.create().show();

            //注意:
            //必须要这一句代码:result.confirm()表示:
            //处理结果为确定状态同时唤醒WebCore线程
            //否则不能继续点击按钮
            result.confirm();
            return true;
        }


        @Override
        public void onReceivedTitle(WebView view, String title) {
            super.onReceivedTitle(view, title);


            navigationBar.init(title, true, new View.OnClickListener(){

                @Override
                public void onClick(View view) {
                    finish();
                }
            });
        }


        @Override
        public void onReceivedIcon(WebView view, Bitmap icon) {
            super.onReceivedIcon(view, icon);
        }

        @Override
        public void onProgressChanged(WebView view, int newProgress) {

            progressBar.setProgress(newProgress);
        }

    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //释放资源
        webView.destroy();
        webView = null;
    }
} 

三、常用方法:

void loadUrl(String url):加载网络链接 url
boolean canGoBack():判断 WebView 当前是否可以返回上一页
goBack():回退到上一页
boolean canGoForward():判断 WebView 当前是否可以向前一页
goForward():回退到前一页
onPause():类似 Activity 生命周期,页面进入后台不可见状态
pauseTimers():该方法面向全局整个应用程序的webview,它会暂停所有webview的layout,parsing,JavaScript Timer。当程序进入后台时,该方法的调用可以降低CPU功耗。
onResume():在调用 onPause()后,可以调用该方法来恢复 WebView 的运行。
resumeTimers():恢复pauseTimers时的所有操作。(注:pauseTimers和resumeTimers 方法必须一起使用,否则再使用其它场景下的 WebView 会有问题)
destroy():销毁 WebView
clearHistory():清除当前 WebView 访问的历史记录。
clearCache(boolean includeDiskFiles):清空网页访问留下的缓存数据。需要注意的时,由于缓存是全局的,所以只要是WebView用到的缓存都会被清空,即便其他地方也会使用到。该方法接受一个参数,从命名即可看出作用。若设为false,则只清空内存里的资源缓存,而不清空磁盘里的。
reload():重新加载当前请求
setLayerType(int layerType, Paint paint):设置硬件加速、软件加速
removeAllViews():清除子view。
clearSslPreferences():清除ssl信息。
clearMatches():清除网页查找的高亮匹配字符。
removeJavascriptInterface(String interfaceName):删除interfaceName 对应的注入对象
addJavascriptInterface(Object object,String interfaceName):注入 java 对象。
setVerticalScrollBarEnabled(boolean verticalScrollBarEnabled):设置垂直方向滚动条。
setHorizontalScrollBarEnabled(boolean horizontalScrollBarEnabled):设置横向滚动条。
loadUrl(String url, Map<String, String> additionalHttpHeaders):加载制定url并携带http header数据。
evaluateJavascript(String script, ValueCallback resultCallback):Api 19 之后可以采用此方法之行 Js。
stopLoading():停止 WebView 当前加载。
clearView():在Android 4.3及其以上系统这个api被丢弃了, 并且这个api大多数情况下会有bug,经常不能清除掉之前的渲染数据。官方建议通过loadUrl(“about:blank”)来实现这个功能,阴雨需要重新加载一个页面自然时间会收到影响。
freeMemory():释放内存,不过貌似不好用。
clearFormData():清除自动完成填充的表单数据。需要注意的是,该方法仅仅清除当前表单域自动完成填充的表单数据,并不会清除WebView存储到本地的数据。

四、 webview三大属性:WebSettings、WebViewClient、WebChromeClient

1. WebSettings常用方法:

setJavaScriptEnabled(boolean flag):是否支持 Js 使用。
setCacheMode(int mode):设置 WebView 的缓存模式。
setAppCacheEnabled(boolean flag):是否启用缓存模式。
setAppCachePath(String appCachePath):Android 私有缓存存储,如果你不调用setAppCachePath方法,WebView将不会产生这个目录。
setSupportZoom(boolean support):是否支持缩放。
setTextZoom(int textZoom):Sets the text zoom of the page in percent. The default is 100。
setAllowFileAccess(boolean allow):是否允许加载本地 html 文件/false。
setDatabaseEnabled(boolean flag):是否开启数据库缓存
setDomStorageEnabled(boolean flag):是否开启DOM缓存。
setUserAgentString(String ua):设置 UserAgent 属性。
setLoadsImagesAutomatically(boolean flag):支持自动加载图片
setAllowFileAccessFromFileURLs(boolean flag::允许通过 file url 加载的 Javascript 读取其他的本地文件,Android 4.1 之前默认是true,在 Android 4.1 及以后默认是false,也就是禁止。
setAllowUniversalAccessFromFileURLs(boolean flag):允许通过 file url 加载的 Javascript 可以访问其他的源,包括其他的文件和 http,https 等其他的源,Android 4.1 之前默认是true,在 Android 4.1 及以后默认是false,也就是禁止如果此设置是允许,则 setAllowFileAccessFromFileURLs 不起做用。
boolean getLoadsImagesAutomatically():是否支持自动加载图片。

2. WebViewClient常用方法:

onPageStarted(WebView view, String url, Bitmap favicon):WebView 开始加载页面时回调,一次Frame加载对应一次回调。
onLoadResource(WebView view, String url):WebView 加载页面资源时会回调,每一个资源产生的一次网络加载,除非本地有当前 url 对应有缓存,否则就会加载。
shouldInterceptRequest(WebView view, String url):WebView 可以拦截某一次的 request 来返回我们自己加载的数据,这个方法在后面缓存会有很大作用。
shouldInterceptRequest(WebView view, android.webkit.WebResourceRequest request):WebView 可以拦截某一次的 request 来返回我们自己加载的数据,这个方法在后面缓存会有很大作用。
shouldOverrideUrlLoading(WebView view, String url):是否在 WebView 内加载页面。
onReceivedSslError(WebView view, SslErrorHandler handler, SslError error):WebView ssl 访问证书出错,handler.cancel()取消加载,handler.proceed()对然错误也继续加载。
onPageFinished(WebView view, String url):WebView 完成加载页面时回调,一次Frame加载对应一次回调。
onReceivedError(WebView view, int errorCode, String description, String failingUrl):WebView 访问 url 出错。

3. WebChromeClient常用方法

onConsoleMessage(String message, int lineNumber,String sourceID):输出 Web 端日志。
onProgressChanged(WebView view, int newProgress):当前 WebView 加载网页进度。
onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result):处理 JS 中的 Prompt对话框
onJsAlert(WebView view, String url, String message, JsResult result): Js 中调用 alert() 函数,产生的对话框。
onReceivedTitle(WebView view, String title):接收web页面的 Title。
onReceivedIcon(WebView view, Bitmap icon):接收web页面的icon。