每天记录学习的新知识 :WebView介绍以及基本使用和方法
WebView介绍以及基本使用和方法
- 一、简介
- 二、调用:
- 三、方法介绍
- 3.1 WebView状态控制
- 3.2 WebView销毁和清理
- 3.3 WebView网页切换
- 3.4 WebView的回调监听
- 3.5 WebView尺寸获取
- 3.6 加载方式
- 参考和转载:
一、简介
Webview 是一个基于webkit引擎,可以解析DOM 元素,展示html页面的控件。
- 作用
显示和渲染网页,与JS交互实现混合开发 - 通性
不管是android还是ios,WebView都是基于webkit开发 - 优势
原生App如果想修改前端内容,需要升级打包,重新发布才可以使用最新的;
WebView想修改前端内容,因为加载的是html或者js文件,所以直接部署服务器端即可。
二、调用:
- 添加权限
<uses-permission android:name="android.permission.INTERNET"/>
- 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();}}
}
- 调用:
WebActivity.start(this,"http://www.baidu.com");
- 扩展
使用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代码方法的共同和区别
共同点:
- 建议编码格式是utf-8;
- loadData不需要自己实现历史记录功能;loadDataWithBaseURL需要自己实现。
区别
loadData()中的html data不能包含’#’,’%’,’\’,’?’四种特殊字符,如果有的话可以用 %23, %25, %27, %3f,这些字符来替换;
loadDataWithBaseURL() 可以使用特殊字符
参考和转载:
参考地址:webview的简单介绍
参考地址:https://blog.csdn.net/u014712086/article/details/78629890
参考地址:WebView全面解析,TokyoZ
每天记录学习的新知识 :WebView介绍以及基本使用和方法相关推荐
- 每天记录学习的新知识:开源代码是否可以商用在项目中?
开源代码是否可以商用? 是否可以商用? 如何查看许可证是哪个? 什么是 Apache License 2.0 ? 如何使用开源代码? 1.根路径添加 LICENSE 文件 2.根路径添加 NOTICE ...
- 每天记录学习的新知识 : Disposable和CompositeDisposable
CompositeDisposable 一.Disposable 1.简介 2.调用 2.1.主动解除订阅 2.2.查询是否解除订阅 true 代表 已经解除订阅 2.3.栗子 2.4.取消订阅的操作 ...
- 每天记录学习的新知识 :Navigation
Navigation 前言 Navigation Activity 多个Fragment的情况 Fragment 嵌套 Fragment 参考地址 前言 Jetpack 是一个丰富的组件库,它的组件库 ...
- 每天记录学习的新知识:圆的运算公式
前言: 对于圆的运算,忘记得很彻底,回顾一下. 公式: 圆的周长,C=2πr 或 C=πd 圆的面积,S=πr2=πd2/4 弧度 1弧度约为57.3°,即57°17'44.806'',1°为π/18 ...
- 每天记录学习的新知识:ContentResolver
ContentResolver 一.用途 二.方法 三.使用 1.查询 2.插入 3.数据刷新通知 4.可以用于监听系统的数据变化 参考地址 一.用途 ContentResolver直译为内容解析器, ...
- 每天记录学习的新知识 : gilde 和 picasso的区别
区别和联系 1.Context 不同 Picasso.with(只能传入上下文) . Glide.with,后面可以传入上下文,activity实例,FragmentActivity实例,Fragem ...
- 每天记录学习的新知识:利用高德地图绘制历史路线
前提: App需要展示行程路线,这里用的是高德地图的Api 绘制路线: 首先下载了官方提供的 AMap3DDemo ,运行后找到 case 多彩线绘制,仿照它基本上可以实现路线绘制. 绿色位置请忽略. ...
- 【每天学习一点新知识】中间人攻击是什么
目录 中间人攻击介绍 中间人攻击原理 1. ARP欺骗 2. DNS欺骗 防御方法 中间人攻击介绍 中间人攻击(man-in-the-middle attack, abbreviated to MIT ...
- 每天学习一点新知识(一)——Unity开发游戏的拆包
每天学习一点新知识(一)--Unity开发游戏的解包 用了CSDN有一段时间了,但一直都没有写过blog,只是在输入,没有输出.而且一直主要都是在查一些作业.题解什么的,还是希望自己能够多学到一些新东 ...
最新文章
- 码云gitee最大文件限制
- CAN总线简明易懂教程(一)
- 三大牛人看外国文献的方法
- windows下mysql安装配置启动
- 动态规划专题 01背包问题详解【转】
- ListGetandSetDemo 集合操作get set remove add方法
- 伽马分布极大似然估计_一文通俗解释极大似然估计
- mysql v7.11_编译后MySQL v5.7.11安装出错
- python中重要的基础概念
- Delphi书籍 教程下载
- 如何用吹风机计算机主机清理,用吹风机吹电脑里的灰尘可以吗?
- STM32F103驱动无刷直流电机应用思路
- 【制作脑图】万彩脑图大师教程 | 关于设置
- PPPoE协议应用场景
- Catch That Cow S
- 计算机高水平竞赛,国际类高水平的竞赛有哪些?
- 广西北海中学2021年高考成绩查询,2021年北海中考录取分数线,历年北海各高中录取分数线排名...
- cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso
- 2022数维杯国际数学建模C题代码+思路+报告
- 【react】antd DatePicker禁止当天前后时间