WebView相关方法解析

WebView相关操作

.
.
.

1.加载网页的四种方式

2.控制网页的前进和后退

3.Webview状态管理

4.webview相关常用类简介

5.控制JS运行

6.控制网页的大小和缩放

7.缓存策略

8.WebViewClient

9.资源请求回调

10.地址拦截

11.WebViewClient发生错误时的处理

12.WebChromeClient处理网页信息

13.android调用JS代码

14.JS调用android代码

1.加载网页的四种方式:

1.1 loadUrl(String url)
这个url可以是web的URL:loadUrl(“https://www.csdn.net/”);

也可以是本地资源文件下的html页面:loadUrl("file:///android_asset/index.html");

说手机SD卡中的页面:
loadUrl(webView.loadUrl("file://"+Environment.getExternalStorageDirectory().getPath()+"index.html")

1.2 loadUrl(String url,Map<String,String> addidionalHttpHeaders)
这个方法是在上述方法的基础上添加了 ddidionalHttpHeaders 参数。这个参数会被添加到RequestHeaders中。
使用方法;

    webView.setWebViewClient(new WebViewClient()
        {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            //这里放入了我们自定义的请求头
                Map<String,String > reqHeaders = new HashMap<>();
                reqHeaders.put("header_key","panghu");
                webView.loadUrl(url,reqHeaders);
                return super.shouldOverrideUrlLoading(view, request);
            }
        });

1.3 loadData(String data,String mimeType,String encoding)
这个方法允许我们将一段html代码加载到我们的webview中。
使用方法:

webView.loadData("<h1>HelloWord</>","text/html","utf-8");

1.4 loadData(String baseUrl,String data,String minmeType,Sstring historyUrl)
这个方法是在上边的代码的基础上增加了一个baseUrl和historyUrl参数。这个代表了将baseUrl和data拼接起来之后的路径。historyUrl代表了点击后退时候所跳转的代码。

2.控制网页的前进和后退
所有的前进后者后退都是依靠浏览历史来决定的
关键方法如下:
2.1boolean canGOBack():是否可以后退
2.2 boolean canGoForward():是否可以前进
2.3boolean canGoBackOrForward(int step):是否可以前进或者后退指定步数(正为前进,负为后退)
2.4 void goBack():后退到上一页
2.5 void goForward():前进到下一页
2.6 void goBackOrForward(int steps):前进或者后退到指定步数的页面
2.7 void clearHistory():清空历史记录

3.Webview状态管理:
类似Activity拥有生命周期,webview拥有类似的状态管理:
onPause():通知内核暂停当前网页上的所有动作
onResume():通知内核回复当前网页上的所有动作
onPauesTimers():通知内核暂停所有网页上的动作
onResumeTimers():通知内核恢复所有网页的动作
destory():销毁WebVIew

这些回调函数与Activity的回调函数应该搭配起来使用

4.webview相关常用类简介:
1.webSettings:对webView进行配置和管理
2.WebViewClient:处理网页加载的回调通知
3.WebChromeClient::辅助webview去处理JS对话框标题进度等

5.控制允许JS运行:
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);

6.控制网页的缩放:
setSupportZoom(boolean):是否支持缩放
setBuiltInZoomControls(boolwan):设置内置的缩放控件
setDisplayZoomControls(boolean):是否显示原生缩放控件

7.缓存策略:

wetSettings.setCacheMode(MODE_NAME);
MODE_NAME有以下几种方式
**LOAD_CACHE_ONLY:**永远不使用缓存
**LOAD_CACHE_ELSE_NETWORK:**只要本地有缓存就使用本地缓存,本地没有缓存就加载网络资源
LOAD_DEFAULT(默认):根据cache_control决定是否使用缓存
**LOAD_NO_CACHE:**永远不使用缓存,只从网络获取

8.WebViewClient:
处理网页的各种回调通知

        webView.setWebViewClient(new WebViewClient()
        {
            /**
             *在webview进行请求之前进行回调 
             * @param view
             * @param url
             * @return
             */
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return super.shouldOverrideUrlLoading(view, url);
            }

            /**
             * 在webview进行请求之前进行回调 ,仅在5.0以后可以使用
             * @param view
             * @param request
             * @return
             */
            @Nullable
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                return super.shouldInterceptRequest(view, request);
            }

            /**
             * 在网页加载的 时候进行回调
             * @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 onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
            }

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

10.地址拦截
同样在webclient的回调方法中,有一个方法为:
boolwan shouldOverrideUrlLoading(WebView view ,String url):在将要加载新的url的时候进行回调

 		  @Nullable
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                return super.shouldInterceptRequest(view, url);
            }


		 /**
             * 
             * @param view
             * @param request
             * @return 返回false的时候代表webview进行处理新的请求,返回true的时候代表我们进行处理
             */
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
			if("http://www.baidu.com".equals(request.getUrl()))
				{
					view.loafUrl("http://www.mooc.com")
					return true;
				}
                return super.shouldOverrideUrlLoading(view, request);
            }

11.WebViewClient发生错误时的处理:


            /**
             * 在6.0以后使用
             * @param view
             * @param request
             * @param error
             */
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
            }

            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
            }

12.WebChromeClient处理网页信息:
几个重要的回调方法:

 webView.setWebChromeClient(new WebChromeClient()
        {
            /**
             * 获取网页加载的进度
             * @param view
             * @param newProgress
             */
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
            }

            /**
             * 获取网页的标题
             * @param view
             * @param title
             */
            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
            }

            /**
             * 网页将要打开一个Alert的时候进行回调
             * @param view
             * @param url
             * @param message
             * @param result
             * @return 返回为false的时候表示webview对此弹出处理,返回true的时候代表我们进行处理  
             */
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                return super.onJsAlert(view, url, message, result);
            }

            /**
             * 在网页将要打开一个confirm对话框的时候进行回调
             * @param view
             * @param url
             * @param message
             * @param result
             * @return 返回为false的时候表示webview对此弹出处理,返回true的时候代表我们进行处理  
             */
            @Override
            public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                return super.onJsConfirm(view, url, message, result);
            }

            /**
             * 在网页将要打开一个Prompt对话框的时候进行回调
             * @param view
             * @param url
             * @param message
             * @param defaultValue
             * @param result
             * @return 返回为false的时候表示webview对此弹出处理,返回true的时候代表我们进行处理  
             */
            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
                return super.onJsPrompt(view, url, message, defaultValue, result);
            }
        });

在后面三个弹出框中,如果我们要自行处理逻辑,需要将我们的结果返回给JS代码。我们可以利用result这个参数的result.confirm()或者result.cancel().方法来将结果提交给JS

13.android调用JS代码:

webview.loadUrl("javaScript::${functionName}") //不需要返回值时调用
//需要返回值时调用 api>19
  webView.evaluateJavascript("javascript:${functionName}", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String s) {
                
            }
        });

14.JS调用android代码:

在上方我们进行访问拦截的时候,我们获取到将要跳转的域名,然后根据域名来进行拦截。其实我们也可以用域名来传递某些信息:假设我们的域名为“android://print?msg = 123”.
那我们就可以根据这个域名来抵用我们安卓本地的print方法。代码如下:

  @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Uri uri = Uri.parse(url);
                if("android".equals(uri.getScheme()))//协议名为android,表示为商定好的协议
                {
                    String funcName = uri.getAuthority();
                    if ("print".equals(funcName))
                    {
                        String msg = uri.getQueryParameter("msg");
                        print(msg);
                    }
                }
                return true;
            }

  private void print(String msg) {
        Log.d("panghu", "print: "+msg);
    }

这样就完成了JS调用Android代码的功能。当我们需要返回一些数据的时候,我们可以利用android调用JS的方法时候,将数据作为参数调用JS的固定方法。

使用对象映射的方式(在4.2之后可以使用):
首先我们要有一个映射类:

public class DemoObject {

    @JavascriptInterface
    public String print(String msg)
    {
        Log.d(TAG, "print: "+msg);
        return "fanhuizhi";
    }
}

然后调用:

webView.addJavascriptInterface(new DemoObject(),"android");

为这个类的对象起一个名字“android”。然后再html中,我们有一个JS函数是这样的:

function getMsg()
{
	var result = android.print("hahaha") //这个result就是android代码给我们的返回值
}

关于WebView的使用就是这些,有不足的地方后续再完善

发布了47 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41525021/article/details/104445882