WebView浏览器组件

一、基础知识

1、什么是WebView

WebView是Android中UI组件的一种,WebView基于webkit内核(Chromium)。

2、WebView有什么用

WebView可以用来展示网页,并且与网页进行交互。

3、网页的基本组成

WebView浏览器组件_第1张图片

二、使用介绍

一、WebView加载资源的4种方式

1、loadUrl(String url)

1.加载网页。

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

2.加载sd卡中的资源。

mWebView.loadUrl("file://" + Environment.getExternalStorageDirectory().getPath() + "/1/test.html");

3.加载app资源文件种的资源。在src的main文件夹种新建文件夹assets,将要加载的资源放到其中,使用时assets文件夹路径固定写法为:/android_asset/

mWebView.loadUrl("file://" + "/android_asset/bookmarks.html");

注意,加载sd卡或app资源文件时,路径之前都要加上"file://"

2、loadUrl(String url, Map additionalHttpHeaders)

   

3、loadData(String data, String mimeType, String encoding)

    可以直接将一段html代码加载到WebView当中,参数data是html代码的内容,mimeType是mime类型,参数encoding是编码类型。代码示例如下:

mWebView.loadData("

Hello WebView

", "text/html", "utf-8");

3、loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String failUrl)

二、控制网页的前进和后退

  • boolean canGoBack()    //是否可以后退
  • void goBack()    //后退一步
  • boolean canGoForward()    //是否可以前进
  • void goForward()    //前进一步
  • boolean canGoBackOrForward(int steps)    //是否可以后退或前进steps步,正数表示前进,负数表示后退。
  • void goBackOrForward(int steps)    //前进或后退steps步,正数表示前进,负数表示后退。

网页的前进或者后退都是基于浏览记录来进行的,通过void clearHistory()方法可以清空浏览记录,浏览记录清空后,所有的前进或后退操作都无法再进行

三、WebView的状态管理

1、onPause()

通知内核暂停所有操作,包括WebView对hrml页面的解析与javaScript的执行等。

2、onResume()

激活WebView为活跃状态,表示可以正常执行网页响应。

3、pauseTimers()

4、resumeTimers()

5、destroy()

销毁WebView。

通过与持有该WebView的Activity的生命周期配合使用,防止Activity推出后WebView依然占用资源。

public class WebViewTestActivity extends AppCompatActivity {

    private WebView mWebView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view_test);

        mWebView = findViewById(R.id.activity_web_view_test_web_view);

    }

    @Override
    protected void onPause() {
        super.onPause();
        mWebView.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mWebView.onResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mWebView.destroy();
    }
}

四、WebView的常用类

1、WebSettings:对WebView进行配置和管理

1.WebView是否支持要访问的页面种的JavaScript代码运行默认不支持,所以会导致JavaScript排版的页面出现混乱。

WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);

2.WebView是否支持缩放操作。

设置是否支持缩放:

void setSupportZoom(boolean support)

 设置内置的缩放控件:

void setBuiltInZoomControls(boolean enabled)

是否隐藏原生的缩放控件:

void setDisplayZoomControls(boolean enabled)

3.WebView对网页的缓存策略。

LOAD_CACHE_ONLY:永远不使用网络,只取本地缓存,没有缓存则不会加载。

LOAD_CACHE_ELSE_NETWORK:只要本地有缓存,无论是否过期都会去使用本地缓存,没有缓存才会去加载网络。

LOAD_DEFAULT:(默认配置)根据cache-control决定是否从网络获取。

LOAD_NO_CACHE:永远不使用缓存,只从网络获取。

通过setCacheMode方法设置缓存策略,如:

WebSettings webSettings = mWebView.getSettings();
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ONLY);

通过clearCache方法可以清除缓存: 

void clearCache(boolean includeDiskFiles)

2、WebViewClient:处理WebView加载时的各种回调通知

    使用WebView时,必须要添加一句:

mWebView.setWebViewClient(new WebViewClient());

     因为WebView的默认配置中,网页的重定向都是由系统默认浏览器打开的,如果不加这一句,就会跳转到系统自带的浏览器。只有指定一个新的WebViewClient,才能在APP本地打开重定向的地址。

常用的处理网页加载时的各种回调通知:

    进行资源请求的时候回调,可以通过参数request获取url等信息:

WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)

    网页已经开始加载的时候回调:

void onPageStarted(WebView view, String url, Bitmap favicon)

     加载网页资源之前回调:

void onLoadResource(WebView view, String url)

     网页加载完成的时候回调:

void onPageFinished(WebView view, String url)

 这4个回调就构成了WebView加载网页时基本的生命周期。shouleInterceptRequest回调和onPageStarted回调的顺序不一定哪个在前,但是一定都在onLoadResource之前。

    WebView将要加载新的URL时进行回调:

boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

 可以理解为重写跳转到新的URL逻辑,代码示例如下:

        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

                if ("http://www.baidu.com/".equals(request.getUrl().toString())) {
                    //如果要加载的是百度则移花接木给他换成搜狗
                    view.loadUrl("http://www.sogou.com/");
                    //return true表示自己处理要加载的URL而不直接由WebView跳转
                    return true;
                }

                //默认返回值为false,表示由WebView处理Url
                return super.shouldOverrideUrlLoading(view, request);
            }
        });

    网页发生错误的时候回调:

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

 通常在这个回调当中进行错误处理时调用view.loadUrl()将WebView跳转展示错误信息的界面。

3、WebChromeClient:辅助WebView去处理JavaScript对话框、标题、进度等

    下面介绍WebChromeClient中的回调:

1.网页加载过程中的回调

    获取网页加载进度的回调(网页加载过程中多次回调,newProgress的值从0到100):

void onProgressChanged(WebView view, int newProgress)

    获取网页标题的回调(网页加载过程中回调一次):

void onReceivedTitle(WebView view, String title)

2.网页弹出对话框相关回调

    以下3个回调对应JS中的三种对话框,默认的返回值为false,表示由WebView默认处理这次对话框弹出,如果返回值为true,表示由我们自己来处理这次对话框弹出。当我们自己处理对话框弹出操作时,需要调用参数result的confirm()、cancel()等方法来告诉网页我们的处理结果。如果返回值为true而没有调用result的方法通知网页对话框处理结果的话,网页将被阻塞住。

    在网页将要打开一个alert警告对话框的时候回调:

boolean onJsAlert(WebView view, String url, String message, JsResult result)

    在网页将要打开一个confirm对话框的时候回调:

boolean onJsConfirm(WebView view, String url, String message, JsResult result)

    在网页将要打开一个prompt对话框的时候回调:

boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)

五、Android与JS互操作

1、Android调用JS代码

  • loadUrl("javascript:方法名(参数...)")
  • evaluateJavascript("javascript:方法名(参数...)", ValueCallback resultCallback)

代码示例:

//示例1
mWebView.loadUrl("javascript:alert(sum(2, 3))");


//示例2
mWebView.evaluateJavascript("javascript:sum(2, 3)", new ValueCallback() {
    @Override
    public void onReceiveValue(String value) {
        //使用Toast弹出sum(2, 3)的结果
        Toast.makeText(WebViewTestActivity.this, value, Toast.LENGTH_SHORT).show();                                   
    }
});

2、JS调用Android代码

  • 通过拦截JavaScript请求的回调方法
  • 对象映射

//todo 抓紧去学一下js,呜呜呜~

三、开发过程中遇到的坑

你可能感兴趣的:(Android常用框架,android)