前言

最近想补一波关于WebView的基础,以下是我所参考的推文地址:请输入链接描述
今天先来讲讲WebView的基础设置及其缓存设置。


WebSettings

WebSettings可以用于配置WebView的相关设置。一般使用webView.getSettings()方法来获取一个WebSettings对象进而进行相关的WebView设置,下面就先上一堆代码慢慢讲解一些常用的设置。

WebSettings settings=webView.getSettings();

首先我们需要获取WebSettings对象

settings.setJavaScriptEnabled(true);

设置为true后就是允许与js交互,这里顺便提一下:

对于Android调用JS代码的方法有2种:

  1. 通过WebView的loadUrl()
  2. 通过WebView的evaluateJavascript()

对于JS调用Android代码的方法有3种:

1. 通过WebView的addJavascriptInterface()进行对象映射
2. 通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url
3. 通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

对于这些交互的方法会在后面的文章中详细说明。

settings.setJavaScriptCanOpenWindowsAutomatically(true);

设置WebView是否可以由 JavaScript 自动打开窗口,默认为 false,通常与 JavaScript 的 window.open() 配合使用。

settings.setDefaultTextEncodingName("UTF-8");

设置符号编码方式,这里设置支持中文的编码方式UTF-8

settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);

设置使用大视图时,适应屏幕

settings.setSupportMultipleWindows(true);

设置支持多窗口。

settings.setSupportZoom(true);

设置支持缩放

settings.setAllowFileAccess(true);

设置支持访问文件。

settings.setNeedInitialFocus(true);

当WebView调用requestFocus时为WebView设置节点,这里可以先设置支持获取手势焦webView.requestFocusFromTouch();

settings.setLoadsImagesAutomatically(true);

支持自动加载图片

settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING);

指定WebView的页面布局显示形式,调用该方法会引起页面重绘。
NORMAL,SINGLE_COLUMN (过时), NARROW_COLUMNS (过时) ,TEXT_AUTOSIZING

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}

这里需要判断一下系统版本,从Lollipop(5.0)开始WebView默认不允许混合模式,https当中不能加载http资源,需要设置开启。


WebViewClient

上述设置之后可以通过webView.loadUrl("https://www.baidu.com/");这样就可以通过WebView访问百度页面了。loadUrl方法可以通过传递一个Url来访问web端。

当我们访问到百度的页面时,可能会出现点击某个链接的时候会自动跳转至系统默认的浏览器。这个明显不符合应用的要求。这是我们需要配置WebViewClient来实现WebView的重定向加载。
我们可以通过设置WebView的WebViewClient来实现页面的重定向。

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.toString().contains("sina.cn")){
                view.loadUrl("https://www.bilibili.com/");
                return true;
            }
            return false;
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
        {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                if (request.getUrl().toString().contains("sina.cn")){
                    view.loadUrl("https://www.bilibili.com/");
                    return true;
                }
            }
            return false;
        }

    });

注:shouldOverrideUrlLoading(WebView view, String url)方法为5.0以前使用的,在5.0以后使用shouldOverrideUrlLoading(WebView view, WebResourceRequest request)代替。
返回值说明:

  • 返回false,意味着请求过程里,不管有多少次的跳转请求(即新的请求地址),均交给webView自己处理,这也是此方法的默认处理
  • 返回true,说明你自己想根据url,做新的跳转,比如在判断url符合条件的情况下,我想让webView加载https://www.bilibili.com/
    只有设置了WebViewClient才能避免点击新的链接跳转至系统浏览器中的情况!

关于缓存机制

WebView现在主要的缓存机制分别是AppCache和DomStorage(dom缓存)。在早些版本还有数据库SQL缓存等,但现在基本上随着html5发布也弃用了。

  1. AppCache:
    AppCache使我们能够有选择的缓冲web浏览器中所有的东西,从页面、图片到脚本、css等等。尤其在涉及到应用于网站的多个页面上的CSS和JavaScript文件的时候非常有用。其大小目前通常是5M。在Android上需要手动开启(setAppCacheEnabled),并设置路径(setAppCachePath)。Android中Webkit使用一个db文件来保存AppCache数据(my_path/ApplicationCache.db)
  2. DomStorage
    如果需要存储一些简单的用key/value对即可解决的数据,DOM Storage是非常完美的方案。根据作用范围的不同,有Session Storage和Local Storage两种,分别用于会话级别的存储(页面关闭即消失)和本地化存储(除非主动删除,否则数据永远不会过期)。在Android中可以手动开启DOM Storage(setDomStorageEnabled),设置存储路径(setDatabasePath)。

注:这个主要是web的用于设置缓存的机制。
在Android中清除缓存时,如果需要清除Local Storage的话,仅仅删除Local Storage的本地存储文件是不够的,内存里面有缓存数据。如果再次进入页面,Local Storage中的缓存数据同样存在。需要杀死程序运行的当前进程再重新启动才可以。

AppCache设置方式:

  • 获取WebViewSettings对象:WebSettings settings = webView.getSettings();
  • 创建一个缓存保存路径:

    String cachePath = new File(Environment.getExternalStorageDirectory(), "webCache").getAbsolutePath();

  • 设置允许AppCache和缓存路径:

    settings.setAppCacheEnabled(true);
    settings.setAppCachePath(cachePath);

  • 可以设置缓存的最大内存大小:(现已被弃用,转为管理自动分配)

    settings.setAppCacheMaxSize(1000 * 1024);

DomStorage设置方式:

  • 设置允许开启dom缓存:

    settings.setDomStorageEnabled(true);

  • 设置缓存路径(现已被弃用)

    settings.setDatabasePath(cachePath);

再来说说缓存的模式,我们可以通过settings.setCacheMode()方法设置缓存模式,该方法接收的参数如以下所示:

  • LOAD_DEFAULT 默认的缓存使用模式。在进行页面前进或后退的操作时,如果缓存可用并未过期就优先加载缓存,否则从网络上加载数据。这样可以减少页面的网络请求次数。
  • LOAD_CACHE_ELSE_NETWORK 只要缓存可用就加载缓存,哪怕它们已经过期失效。如果缓存不可用就从网络上加载数据。
  • LOAD_NO_CACHE 不加载缓存,只从网络加载数据。
  • LOAD_CACHE_ONLY 不从网络加载数据,只从缓存加载数据。

标签: Android WebView

添加新评论