oynix

于无声处听惊雷,于无色处见繁花

Android WebView使用

当需要打开一个URL时,常规操作是用系统浏览器打开,很方便、便捷,不足之处就是只能显示,无法交互。使用SDK提供的WebView可以解决这一点,自然也需要多做一些额外的工作。

1. 简介

简单说,WebView就是一个具备基础功能浏览器,不想市面上的浏览器那样,加入了各种定制化功能。其内部基于webkit引擎,低版本和高版本采用了不同的webkit版本内核,4.4后使用了Chrome内核。而webkit又是什么呢?它是一个开源的web浏览器引擎,即浏览器内核。当我们请求一个URL后,服务器返回来的是一个个文件,如html,css,等,浏览器的工作,就是把这些文件渲染成易读的形式展现给我们,不同的形式、不同的颜色、不同的交互,等。关于简介,就说这么多。

2. 使用

  • 创建
    作为一个控件,和其他控件一样,可以在布局文件中声明,后在使用时代码中获取。也可以在代码中直接创建,然后添加到布局中
  • 基本方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // 同步页面状态到webview,使其可以正常响应,同时在不需要的时候暂停一些动作节省系统资源,如DOM解析,JS执行等
    webView.onResume();
    webView.onPause();

    // 暂停webview的layout,parsing,jstimer
    // 这是针对全局的,而不单单是当前的webview
    webView.pauseTimers();
    webView.resumeTimers();

    // 避免webview在销毁时还在加载导致泄漏,如音乐或视频,所以先将其移出,再执行销毁
    rootLayout.removeView(webView);
    webView.destroy();
  • 前进后退
    1
    2
    3
    4
    5
    6
    webView.canGoBakc();
    webView.goBack();
    webView.canGoForward();
    webView.goForward();
    // 负数后退,正数则前进
    webView.goBackOrForwardd(int steps);
    按下返回键时,Activity会先消费掉此事件,而退出页面,若想按下返回执行webView的后退操作,则需要传递事件给WebView
    1
    2
    3
    public void onBackPressed() {
    webView.goBack();
    }
  • 清除
    1
    2
    3
    4
    5
    6
    7
    // 内核缓存是全局的,所以该操作针对的是全局应用
    webView.clearCache(true);

    // 访问记录
    webView.clearHistory();

    webView.clearFormData();

3. 常用类之WebSettings

用来配置一些和webkit内核相关的属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
WebSettings settings = webView.getSettings();

// JS
settings.setJavaScriptEnabled(true);
// 插件
settings.setPluginsEnabled(true);
// 自适应屏幕,二者合用
settings.setUseViewPort(true); // 将图片调整到适合webview大小
settings.setLoadWithOverviewMode(true); // 缩放至屏幕大小
// 缩放
settings.setSupportZoom(true); // 打开缩放
settings.setBuiltInZoomControls(true); // 内置缩放控件
settings.setDisplayZoomControls(false);
//
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); // 缓存模式
settings.setAllowFileAccess(true); // 访问文件
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setLoadsImagesAutomatically(true);
settings.setDefaultTextEncodingName("utf-8");

// 缓存模式
LOAD_CACHE_ONLY: 只使用缓存
LOAD_DEFAULT:根据cache-control决定是否使用缓存
LOAD_NO_CACHE:不用缓存
LOAD_CACHE_ELSE_NETWORK: 只要本地有,不论过期与否,或者设置了no-cache,都使用缓存中数据

4. 常用类之WebViewClient

主要用来设定WebView的通知、请求事件,如

1
2
3
4
5
6
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
onReceivedSslError WebView默认是不处理https请求的,页面显示空白,需手动处理

5. 常用类之WebChromeClient

主要用来辅助WebView处理对话框、网站图标、标题,加载进度等,如

1
2
3
4
5
6
7
8
onCloseWindow
onCreateWindow
onJsAlert(WebView上alert无效,需要在此处理)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2022/04/fdc247989967/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道