Android WebView 详解

文章首发于我的个人博客网站-查看原文

本文记录 AndroidWebView 控件的相关使用,不断完善中…

主要包括:

  • 基本属性的配置
  • WebView 缓存相关内容
  • JavaJs 的交互
  • WebView 打开本地应用(支付宝等)
  • 加载网络链接,本地 sd 卡路径,assert 目录路径的方法
  • WebView 支持下载等其它一些内容

基本配置汇总

汇总的记录一下 WebView 的配置方法,重要的属性后面会展开说明。

@SuppressLint("SetJavaScriptEnabled")
public static void initWebViewSettings(WebView mWebView) {
    //支持获取手势焦点
    mWebView.requestFocusFromTouch();
    // 触觉反馈,暂时没发现用处在哪里
    mWebView.setHapticFeedbackEnabled(false);
    WebSettings settings = mWebView.getSettings();
    // 支持插件
    settings.setPluginState(WebSettings.PluginState.ON);
    // 允许js交互
    settings.setJavaScriptEnabled(true);
    // 设置WebView是否可以由 JavaScript 自动打开窗口,默认为 false
    // 通常与 JavaScript 的 window.open() 配合使用。
    settings.setJavaScriptCanOpenWindowsAutomatically(true);
    // 允许中文编码
    settings.setDefaultTextEncodingName("UTF-8");
    // 使用大视图,设置适应屏幕
    settings.setUseWideViewPort(true);
    settings.setLoadWithOverviewMode(true);
    // 支持多窗口
    settings.setSupportMultipleWindows(true);
    // 隐藏自带缩放按钮
    settings.setBuiltInZoomControls(false);
    // 支持缩放
    settings.setSupportZoom(true);
    // 设置可访问文件
    settings.setAllowFileAccess(true);
    // 当WebView调用requestFocus时为WebView设置节点
    settings.setNeedInitialFocus(true);
    //支持自动加载图片
    settings.setLoadsImagesAutomatically(true);
    // 指定WebView的页面布局显示形式,调用该方法会引起页面重绘。
    // NORMAL,SINGLE_COLUMN 过时, NARROW_COLUMNS 过时 ,TEXT_AUTOSIZING
    settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
    // 从Lollipop(5.0)开始WebView默认不允许混合模式,https当中不能加载http资源,需要设置开启
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
    }
}

WebView 缓存

清除缓存,true 表示清除磁盘缓存,这个方法是全局的,也就是说会清除掉整个应用所有的 网页缓存。

mWebView.clearCache(true);

清除历史记录

mWebView.clearHistory();

网上有介绍说,设置缓存的目录,清除缓存时删除掉缓存文件,但是使用下面的方法设置缓存路径后,发现文件并没有缓存到指定的目录,不知道是怎么回事?求指教

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

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

    WebSettings settings = mWebView.getSettings();
    settings.setAppCacheEnabled(true);
    settings.setAppCachePath(cachePath);
    settings.setDatabaseEnabled(true);
    // 过时
    settings.setDatabasePath(cachePath);
    // 开启dom缓存
    settings.setDomStorageEnabled(true);
    // 加载模式
    settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
    // 缓存最大值,过时
    settings.setAppCacheMaxSize(1000 * 1024);
}

加载 Url

加载网络路径,headers 不是必选的

Map headers = new HashMap<>();
headers.put("auth","110");
mWebView.loadUrl("https://www.baidu.com/",headers);

加载 assert 路径

// WebViewUtil.java
public static String getAssertUrl(String fileUrl) {
    return "file:///android_asset/" + fileUrl;
}

mWebView.loadUrl(WebViewUtil.getAssertUrl("index.html"));

加载 sd 卡路径

// WebViewUtil.java
public static String getSdUrl(String fileUrl) {
    return "file://" + Environment.getExternalStorageDirectory() + "/" + fileUrl;
}

mWebView.loadUrl(WebViewUtil.getSdUrl("index.html"));    

Js 调用 Java

JavaJs 交互需要定义一个带有 @JavascriptInterface 注解方法的对象,如下:

public class JsBridge {

    @JavascriptInterface
    public void toast(String msg) {
        ToastUtils.show(msg);
    }

    @JavascriptInterface
    public void log(String msg) {
        Log.e(TAG, msg);
    }
}

使用 JsBridge 连接 JavaJs,使用 mWebView.addJavascriptInterface(obj, name); 方法。

  • obj:带有 JavascriptInterface 注解方法的对象实例。
  • name:一个标志符,js 将会使用该标志来调用 java 层的方法。
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new JsBridge(), "android");

在添加调用接口时,我们添加了一个标记,如上面代码中添加的是 android,它相当于调用接口对象的一个别名,因此在 js 中调用 java 方法时,只需要使用 window 对象,如下:

window.android.log('test js invoke java method');

Java 调用 Js

使用 java 调用 js 方法相对简单,假如在 js 中应该声明如下 function


                    
                    

你可能感兴趣的:(Android WebView 详解)