WebView介绍以及基本使用和方法

  • 一、简介
  • 二、调用:
  • 三、方法介绍
    • 3.1 WebView状态控制
    • 3.2 WebView销毁和清理
    • 3.3 WebView网页切换
    • 3.4 WebView的回调监听
    • 3.5 WebView尺寸获取
    • 3.6 加载方式
  • 参考和转载:

一、简介

Webview 是一个基于webkit引擎,可以解析DOM 元素,展示html页面的控件。

  1. 作用
    显示和渲染网页,与JS交互实现混合开发
  2. 通性
    不管是android还是ios,WebView都是基于webkit开发
  3. 优势
    原生App如果想修改前端内容,需要升级打包,重新发布才可以使用最新的;
    WebView想修改前端内容,因为加载的是html或者js文件,所以直接部署服务器端即可。

二、调用:

  1. 添加权限
<uses-permission android:name="android.permission.INTERNET"/>
  1. WebActivity
public class WebActivity extends BaseActivity {@BindView(R.id.web_view)WebView webView;private static final String URI = "URI";public static void start(Context context, String content) {Intent intent = new Intent(context, WebActivity.class);intent.putExtra(URI, content);context.startActivity(intent);}public static void start(Context context) {context.startActivity(new Intent(context, WebActivity.class));}@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_web);ButterKnife.bind(this);setTitle("WEB");initWebView();}private void initWebView() {if (webView != null) {WebSettings webSettings = webView.getSettings();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {webSettings.setSafeBrowsingEnabled(false);}webSettings.setJavaScriptEnabled(true);webSettings.setBlockNetworkImage(false);webSettings.setLoadsImagesAutomatically(true);webSettings.setUseWideViewPort(true);webSettings.setJavaScriptCanOpenWindowsAutomatically(true);webSettings.setAllowFileAccess(true);webSettings.setLoadWithOverviewMode(true);webSettings.setSaveFormData(false);webSettings.setDomStorageEnabled(true);webSettings.setBuiltInZoomControls(false);webSettings.setSupportZoom(false);webSettings.setPluginState(WebSettings.PluginState.ON);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {webSettings.setTextSize(WebSettings.TextSize.NORMAL);try {webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING);} catch (Exception e) {e.printStackTrace();}} else {webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);}String content = getIntent().getStringExtra(URI);LogUtils.i(TAG, "content =" + content);webView.loadUrl(content);webView.setNetworkAvailable(true);webView.setInitialScale(1);webView.requestFocus();webView.addJavascriptInterface(this, "Android");webView.setWebChromeClient(new WebChromeClient() {});webView.setWebViewClient(new WebViewClient() {});}}@Overrideprotected void onDestroy() {super.onDestroy();if (webView != null) {webView.destroy();}}
}
  1. 调用:
WebActivity.start(this,"http://www.baidu.com");
  1. 扩展
    使用Kotlin写一个简单的WebView例子

三、方法介绍

3.1 WebView状态控制

3.1.1 激活WebView为活跃状态

webVIew.onResume();

能正常执行网页的响应

3.1.2 设置WebView为暂停状态

webView.onPause();

效果:WebView会停止内部操作,DOM的解析,plugin的执行,JavaScript的执行

3.1.3 设置WebView为销毁状态

webView.destroy();

时机:在退出WebView界面的时候,需要在进行销毁,必须的操作。

3.1.4 激活应用内WebView为活跃状态

webView.resumeTimers();

3.1.5 设置应用内WebView为暂停状态

webView.pauseTimers()

当应用程序(存在webview)被切换到后台时,这个方法不仅仅针对当前的webview而是全局的全应用程序的webview,它会暂停所有webview的layout,parsing,javascripttimer。降低CPU功耗。

3.1.6 停止加载

webView.stopLoading();

注意:调用不能在线程中执行

3.1.7 刷新页面

webView.reload();

当前页面的所有资源都会重新加载

3.2 WebView销毁和清理

WebView 销毁的时候,需要进行如下几步操作

3.2.1 停止加载

webView.stopLoading();

3.2.2 从布局中删除WebView

webview.getParant.removeView(webView);

3.2.3 设置WebView为销毁状态

webView.destroy();

3.2.4 清理历史记录

  webView.clearHistory();

清除当前webview访问的历史记录
只会webview访问历史记录里的所有记录除了当前访问记录

3.2.5 避免 WebView 的内存泄露问题

@Override
protected void onDestroy() {if (webView != null) {webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);webView.clearHistory();((ViewGroup) webView.getParent()).removeView(webView);webView.destroy();webView = null;}super.onDestroy();
}

3.2.6 清理缓存

Webview.clearCache(true);

清除网页访问留下的缓存,由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.

3.2.7 清除表单数据

Webview.clearFormData();

这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据

3.3 WebView网页切换

3.3.1 后退网页

Webview.goBack()

3.3.2 是否可以后退网页

Webview.canGoBack()

3.3.3 前进网页

Webview.goForward()

3.3.4 是否可以前进网页

Webview.canGoForward()

3.3.5 前进或者后退指定步数

Webview.goBackOrForward(intsteps)

steps为负数则为后退,正数则为前进

3.3.6 例

public boolean onKeyDown(int keyCode, KeyEvent event) {if ((keyCode == KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack();return true;}return super.onKeyDown(keyCode, event);
}

3.3.7 是否滑到底部

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {webView.setOnScrollChangeListener(new View.OnScrollChangeListener() {@Overridepublic void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {if (!webView.canScrollVertically(1)) {AppLogUtils.i(TAG,"到底部了");}else {AppLogUtils.i(TAG,"沒到底部");}}});}

3.4 WebView的回调监听

3.4.1 影响View的事件回调

webView.setWebViewClient();

3.4.2 影响浏览器的事件回调

webView.setWebChromeClient();

3.4.3 长按回调

webView.setOnLongClickListener();

屏蔽长按复制,可以在方法中返回true.

注意:WebView是一种特殊的View,但是因为是View,所以View支持的方法,WebView同样支持。

3.4.3 文件下载的回调

webView.setDownloadListener();

扩展下载实现的链接:WebView使用_WebView监听网页下载_DownloadManager使用

3.4.4 关键字查询回调

        webView.setFindListener(new WebView.FindListener() {@Overridepublic void onFindResultReceived(int position, int all, boolean b) {}});

监听的方法中返回了: 当前位置 + 总数

3.4.5 图片加载完成的回调,可以用于判断页面已呈现

        webView.setPictureListener(new WebView.PictureListener() {@Overridepublic void onNewPicture(WebView webView, @androidx.annotation.Nullable Picture picture) {}});

注:自API 12以来已被弃用,并且自API级别18(4.3)以来返回空图片。 API级别17,它仍然可以正常工作。 如果不需要实际的Picture细节,也可以在API 18中正常工作。

为什么需要setPictureListener监听来判断页面呈现?是因为 onPageFinished(WebView view, String url),webview加载完成会调用这个方法

3.5 WebView尺寸获取

3.5.1 当前内容滚动的距离

webView.getScrollY();

即 获取当前可见区域的顶端距整个页面顶端的距离

3.5.2 WebView控件的高度

webView.getHeight()

3.5.3 获取HTML的高度

webView.getContentHeight();

3.6 加载方式

根据资源类型,加载方式不同。

3.6.1 加载网页

webView.loadUrl("http://www.google.com/");

如果网页连接有Header,需要添加:

HashMap<String,String> header = new HashMap<>();
...
webView.loadUrl(url,header);

3.6.2 加载apk包中的html页面

webView.loadUrl("file:///android_asset/test.html");

3.6.3 加载手机本地的html页面

webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");

3.6.4 加载HTML代码片段

webView.loadData(String data, String mimeType, String encoding)

参数说明:
String data:需要截取展示的内容
内容里不能出现 ’#’, ‘%’, ‘\’ , ‘?’这四个字符,若出现了需用 %23, %25, %27, %3f 对应来替代,否则会出现异常
String mimeType:展示内容的类型
String encoding:字节码

例:

String htmlString = "<h1>Title</h1><p>This is HTML text<br/><i>Formatted in italics</i><br/>Anothor Line</p>";
myWebView.loadData(htmlString, "text/html", "utf-8");

3.6.5 加载HTML代码片段

webView.loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl))

参数说明:
String baseUrl:HTML代码片段中相关资源的相对根路径

String data:需要截取展示的内容
String mimeType:展示内容的类型
String encoding:字节码
String historyUrl:历史Url,可以为null值

例:

String body = "示例:这里有个img标签,地址是相对路径<img src='/uploads/allimg/130923/1FP02V7-0.png' />";
webView.loadDataWithBaseURL("http://www.jcodecraeer.com", body, "text/html", "utf-8",null);

对于baseUrl不是简单的url,如下(转载自 loadData和loadDataWithBaseUrl):

在使用loadDataWithBaseURL时,需要注意的就是 baseUr:虽然API上写的是要传一个Url,但我在用时,发现传一个Url并不可以,我发现这个就是一个标志位,用来标志当前页面的Key值的,而historyUrl就是一个value值,在加载时,它会把baseUrl和historyUrl传到List列表中,当作历史记录来使用,当前进和后退时,它会通过baseUrl来寻找historyUrl的路径来加载historyUrl路径来加载历史界面,需要注意的就是history所指向的必须是一个页面,并且页面存在于SD卡中或程序中(assets),loadDataWithBaseURL,它本身并不会向历史记录中存储数据,要想实现历史记录,需要我们自己来实现,也许是我的技术有限,我有了比较笨的访求来实现:就是在加载页面时,我把数据另外的写到一个html页面中,并把它保存到SD中,当点击返回时,它会通过historyUrl指向的路径来加载页面,这样就解决了历史记录问题。

3.6.7 两种加载HTML代码方法的共同和区别

  1. 共同点:

    1. 建议编码格式是utf-8;
    2. loadData不需要自己实现历史记录功能;loadDataWithBaseURL需要自己实现。
  2. 区别
    loadData()中的html data不能包含’#’,’%’,’\’,’?’四种特殊字符,如果有的话可以用 %23, %25, %27, %3f,这些字符来替换;
    loadDataWithBaseURL() 可以使用特殊字符

参考和转载:

参考地址:webview的简单介绍

参考地址:https://blog.csdn.net/u014712086/article/details/78629890

参考地址:WebView全面解析,TokyoZ

每天记录学习的新知识 :WebView介绍以及基本使用和方法相关推荐

  1. 每天记录学习的新知识:开源代码是否可以商用在项目中?

    开源代码是否可以商用? 是否可以商用? 如何查看许可证是哪个? 什么是 Apache License 2.0 ? 如何使用开源代码? 1.根路径添加 LICENSE 文件 2.根路径添加 NOTICE ...

  2. 每天记录学习的新知识 : Disposable和CompositeDisposable

    CompositeDisposable 一.Disposable 1.简介 2.调用 2.1.主动解除订阅 2.2.查询是否解除订阅 true 代表 已经解除订阅 2.3.栗子 2.4.取消订阅的操作 ...

  3. 每天记录学习的新知识 :Navigation

    Navigation 前言 Navigation Activity 多个Fragment的情况 Fragment 嵌套 Fragment 参考地址 前言 Jetpack 是一个丰富的组件库,它的组件库 ...

  4. 每天记录学习的新知识:圆的运算公式

    前言: 对于圆的运算,忘记得很彻底,回顾一下. 公式: 圆的周长,C=2πr 或 C=πd 圆的面积,S=πr2=πd2/4 弧度 1弧度约为57.3°,即57°17'44.806'',1°为π/18 ...

  5. 每天记录学习的新知识:ContentResolver

    ContentResolver 一.用途 二.方法 三.使用 1.查询 2.插入 3.数据刷新通知 4.可以用于监听系统的数据变化 参考地址 一.用途 ContentResolver直译为内容解析器, ...

  6. 每天记录学习的新知识 : gilde 和 picasso的区别

    区别和联系 1.Context 不同 Picasso.with(只能传入上下文) . Glide.with,后面可以传入上下文,activity实例,FragmentActivity实例,Fragem ...

  7. 每天记录学习的新知识:利用高德地图绘制历史路线

    前提: App需要展示行程路线,这里用的是高德地图的Api 绘制路线: 首先下载了官方提供的 AMap3DDemo ,运行后找到 case 多彩线绘制,仿照它基本上可以实现路线绘制. 绿色位置请忽略. ...

  8. 【每天学习一点新知识】中间人攻击是什么

    目录 中间人攻击介绍 中间人攻击原理 1. ARP欺骗 2. DNS欺骗 防御方法 中间人攻击介绍 中间人攻击(man-in-the-middle attack, abbreviated to MIT ...

  9. 每天学习一点新知识(一)——Unity开发游戏的拆包

    每天学习一点新知识(一)--Unity开发游戏的解包 用了CSDN有一段时间了,但一直都没有写过blog,只是在输入,没有输出.而且一直主要都是在查一些作业.题解什么的,还是希望自己能够多学到一些新东 ...

最新文章

  1. 码云gitee最大文件限制
  2. CAN总线简明易懂教程(一)
  3. 三大牛人看外国文献的方法
  4. windows下mysql安装配置启动
  5. 动态规划专题 01背包问题详解【转】
  6. ListGetandSetDemo 集合操作get set remove add方法
  7. 伽马分布极大似然估计_一文通俗解释极大似然估计
  8. mysql v7.11_编译后MySQL v5.7.11安装出错
  9. python中重要的基础概念
  10. Delphi书籍 教程下载
  11. 如何用吹风机计算机主机清理,用吹风机吹电脑里的灰尘可以吗?
  12. STM32F103驱动无刷直流电机应用思路
  13. 【制作脑图】万彩脑图大师教程 | 关于设置
  14. PPPoE协议应用场景
  15. Catch That Cow S
  16. 计算机高水平竞赛,国际类高水平的竞赛有哪些?
  17. 广西北海中学2021年高考成绩查询,2021年北海中考录取分数线,历年北海各高中录取分数线排名...
  18. cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso
  19. 2022数维杯国际数学建模C题代码+思路+报告
  20. 【react】antd DatePicker禁止当天前后时间

热门文章

  1. 高品质混响延迟插件9个合集 – ValhallaDSP Bundle 2020 WiN
  2. 青橙商城项目总结day02
  3. c语言扬声器程序,通过扬声器C编程并播放声音
  4. pyzbar+uiautomation(实现扫码进入微信大学习)
  5. java中spi机制解读
  6. 全球与中国汽油滤清器市场深度研究分析报告
  7. HTML5/CSS3基础——div盒子水平垂直居中的三种方案
  8. java 魔法值_可别在代码种写那么多魔法值了!
  9. Jupyter notebook使用大全
  10. Unity利用相机创建分屏和画中画