【基础】WebView浏览器组件-程序员宅基地

技术标签: android  

一、基础知识

1、什么是WebView

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

2、WebView有什么用

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

3、网页的基本组成

二、使用介绍

一、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("<h1>Hello WebView</h1>", "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<String> resultCallback)

代码示例:

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


//示例2
mWebView.evaluateJavascript("javascript:sum(2, 3)", new ValueCallback<String>() {
    @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,呜呜呜~

三、开发过程中遇到的坑

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43526787/article/details/118277967

智能推荐

使用docker安装jdk、tomcat、mysql、nginx-程序员宅基地

文章浏览阅读2.3k次,点赞2次,收藏18次。使用docker安装jdk、tomcat、mysql、nginx_docker安装jdk

HTTP 健康检查(HTTP Health Check)_http健康检查-程序员宅基地

文章浏览阅读3.7k次。Http 健康检查通过发送周期健康检查,监视 upstream 组中 HTTP 服务的健康状态。包括有NGINX Plus 的自定义主动健康检查。简介NGINX 和NGINX Plus 能够持续的检测 upstream 中的服务,剔除宕机的服务,还可以优雅的将恢复的的服务添加到负载均衡组群中。前提对于被动健康检查,你需要使用开源 NGINX 或者 NGINX Plus对于主动健康检查和实时活动监视仪表板,你需要使用 NGINX Plus一个HTTP upstream 负载均衡群组被动健康_http健康检查

Linux下python安装升级详细步骤 | Python2 升级 Python3_linux 升级python-程序员宅基地

Linux下Python升级步骤:下载源tar包,安装成功后需修改yum配置,使其正常使用。

解决Debian 11系统缺少无线网卡固件rtl8192cfw.bin_firmware-realtek-程序员宅基地

文章浏览阅读8.1k次。解决Debian 11系统缺少无线网卡固件rtl8192cfw.bin一,先简单介绍解决办法“rtlwifi/rtl8192cfw.bin”是无线网卡的固件,其实缺少它网卡也是可以用的,只是不知道是不是这个原因导致丢包频繁。在CSDN找到了这篇文章:“U盘安装Debian,提示缺少无线网卡驱动(blog.csdn.net/gaisylly/article/details/50446406)”,然后我找到了一份deb包(ftp.cn.debian.org/debian/pool/non-free/f/fi_firmware-realtek

Android版哆啦A梦连连看游戏源码完整版-程序员宅基地

文章浏览阅读60次。2019独角兽企业重金招聘Python工程师标准>>> ..._哆啦a梦连连看1.6下载

word画流程图工具-程序员宅基地

文章浏览阅读2.9k次。流程图,可以说是日常办公中比较常见的一种图表了,开会,有会议流程;采购,有采购流程;财务付款,有付款流程;工作,也有工作流程,可以说它是无处不在。对于普通上班族、白领来说,Office的三个标配Word、Excel、PPT是最常用的工具,但是它却不是最佳的绘制流程图的软件!使用Word、PPT画流程图总是千篇一律,没有特色,如果才能设计出精美、又独具特色的流程图呢?亿图图示设..._word流程图插件

随便推点

带你用 Python 实现自动化群控(入门篇)-程序员宅基地

文章浏览阅读1.7k次,点赞3次,收藏22次。点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤别君去兮何时还?且放白鹿青崖间。须行即骑访名山。1. 前言群控,相信大部..._自己写群控

带你真正认识Linux 系统结构_带你真正认识linux系统结构-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏16次。带你真正认识Linux 系统结构Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。1. linux内核内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linu_带你真正认识linux系统结构

Navicat连接Mysql教程_navicat中mysqldump-程序员宅基地

文章浏览阅读4.1w次,点赞74次,收藏840次。Navicat连接Mysql教程​ Navica作为一个数据库管理工具,容易上手轻便,这里就当介绍给大家认识认识,同时加深自己的使用过程。文章目录Navicat连接Mysql教程一、检查mysql环境二、测试Navicat连接mysql数据库一、检查mysql环境​ 在介绍 navicat之前先检查一下 mysql安装环境是否成功。命令行输入:mysql -V出现下图表示你的mysql环境安装是成功的。这个时候我们通过命令行进入mysql查看自己建立过得数据库mysql -_navicat中mysqldump

SpringBoot详解-程序员宅基地

文章浏览阅读1.8w次,点赞13次,收藏148次。Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。......_springboot

C语言字符(&串&数组)处理复习笔记_char str2[] = new char[3]{'w','o','r'}-程序员宅基地

文章浏览阅读103次。C语言字符(&串&数组)处理复习笔记几个函数1.putchar(ch):输出一个字符2.getchar():输入一个字符#include<stdio,h>int main(){ char a,b,c; a = getchar(); b = getchar(); c = getchar(); putchar(a); putchar(b); putchar(c); putchar('\n'); return 0;3.puts(str):输出一个字符串_char str2[] = new char[3]{'w','o','r'}

仿射密码解密(Affine Cipher)-程序员宅基地

文章浏览阅读4.9w次,点赞38次,收藏105次。仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母。A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 ..._仿射密码