【eoe Android特刊】第二十四期Android WebView
一、Android WebView是什么
1.1Aandroid WebView一些基本概念
在android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件。
WebKit是Mac OS X v10.3及以上版本所包含的软件框架(对v10.2.7及以上版本也可通过软件更新获取)。同时,WebKit也是Mac OS X 的Satari网页浏览器的基础。WebKit是一个开源项目,主要由KDE的KHTML修改而来并且包含了一些来自苹果公司的一些组件。
传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavasSriptCore,它们分别对应的是KDDE的KHTML和KJS。不过,随着JavaScript引擎的独立性越来越强,现在WebKit和WebCore已经基本上混用不分(例如Google Chrome和Maxthon3采用V8引擎,却仍然宣传自己是WebKit内核)。
这里我们初步体验一下在android是使用WebView浏览网页,在SDK的Dev Guide中有一个WebView简单的例子。
在开发过程中应该注意几点:
1、 AndroidManifest.xml中必须使用许可“android.permission.INTERNET”,否则会出Web page not available错误。
2、 如果访问的页面中有JavaScript,则WebView必须设置支持JavaScript。
Webview.getSettings().setJavaScriptEnabled(true);
3、 如果页面中有链接,如果希望点击链接继续前往当前browser中响应,而不是新开android系统的browser中响应链接,必须覆盖WebView的WebViewClient对象。
mWebView.setWebViewClient(new WebViewClient(){
public Boolean shouldOverrideUrlLoading(WebView view,String url){
view.loadUrl(url);
return true;
}
})
4、 如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理病消掉该Back事件。
Public Boolean onKeyDown(int KeyCode,KeyEnvent event){
If((keyCode == KeyEnvent.KEYCODE_BACK) && mWebView.canGoBack()){
mWebView.goBack();
return true;
}
Return super.onKeyDown(keyCode,envent);
}
下一步让我们来了解一下android中WebView是如何支持javascript自定义对象的,在w3c标准中js有window、history、document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以为所欲为了。
看一个实例:
package test.webview; import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.webkit.WebSettings;import android.webkit.WebView; public class WebViewDemoActivity extends Activity { private WebView mWebView; private Handler mHandler = new Handler(); public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); mWebView = (WebView) findViewById(R.id.webView); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new Object() { public void clickOnAndroid() { mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:wave()"); } }); } }, "demo"); mWebView.loadUrl("file:///android_asset/demo.html"); }}
我们看addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是interfaceName(demo),作用域是Global.这样初始化WebView后,在WebView加载的页面中就可以直接通过javascript:window.demo访问到绑定的java对象了。来看看html中是怎样调用的。
<html><mce:script language="javascript"><!--function wave() {document.getElementById("droid").src="android_waving.png";}// --></mce:script><body><a onClick="window.demo.clickOnAndroid()"><img id="droid" src="ic_launcher.png" mce_src="ic_launcher.png"/><br>Click me!</a></body></html>
这样在javascript中就可以调用java对象clickOnAndroid()方法了,同样我们可以在此对象中定义很多方法(比如发短信、调用联系人列表等手机系统功能),这里wave()方法是java中调用javascript的例子。
这里还有几个知识点:
1)为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为“file:///android_asset/”。WebView遇到这样的schema,就去当前包中的assets目录中找内容。如上面的“file:///android_asset/demo.html”。
2)addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用Handler的目的。
1.2Android WebView组件的使用详解
网络内容
1、LoadUrl直接显示网页内容(单独显示网络图片)
2、LoadData显示中文网页内容(含空格的处理)
APK包内文件
1、LoadUrl显示APK中html和图片文件。
2、LoadData(loadDataWithBaseURL)显示APK这图片和文字混合的html内容res/layout/main.xml
xml代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <WebView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/WebView" /></LinearLayout>
Java代码:
package test.webview; import java.net.URLEncoder;import android.app.Activity;import android.os.Bundle;import android.webkit.WebView;public class WebViewDemoActivity extends Activity { WebView WebView; final String mimeType = "text/html"; final String encoding = "utf-8"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); WebView = (WebView) findViewById(R.id.webView); WebView.getSettings().setJavaScriptEnabled(true); // //webHtml(); // //webImage(); // //localHtmlZh(); // //localHtmlBlankSpace(); // //localHtml(); // // localImage(); // localHtmlImage(); } /** * 直接网页显示 */ private void webHtml() { try { WebView.loadUrl("http://www.google.com"); } catch (Exception ex) { ex.printStackTrace(); } } /** * 直接网络图片显示 */ private void webImage() { try { WebView .loadUrl("http://www.gstatic.com/codesite/ph/images/code_small.png"); } catch (Exception ex) { ex.printStackTrace(); } } /** * 中文显示 */ private void localHtmlZh() { try { String data = "测试含有中文的Html 数据"; // utf-8 编码处理(在SDK1.5 模拟器和真实设备上都将出现乱码,SDK1.6 上能正常显示) //WebView.loadData(data, mimeType, encoding); // 对数据进行编码处理(SDK1.5 版本) WebView.loadData(URLEncoder.encode(data, encoding), mimeType, encoding); } catch (Exception ex) { ex.printStackTrace(); } } /** * 中文显示(空格的处理) */ private void localHtmlBlankSpace() { try { String data = " 测试含有空格的Html 数据"; // 不对空格做处理 WebView.loadData(URLEncoder.encode(data, encoding), mimeType, encoding); //WebView.loadData(data, mimeType, encoding); // 对空格做处理(在SDK1.5 版本中) WebView.loadData(URLEncoder.encode(data, encoding).replaceAll( "\\+", " "), mimeType, encoding); } catch (Exception ex) { ex.printStackTrace(); } } /** * 显示本地图片文件 */ private void localImage() { try { // 本地文件处理(如果文件名中有空格需要用+来替代) WebView.loadUrl("file:///android_asset/icon.png"); } catch (Exception ex) { ex.printStackTrace(); } } /** * 显示本地网页文件 */ private void localHtml() { try { // 本地文件处理(如果文件名中有空格需要用+来替代) WebView.loadUrl("file:///android_asset/test.html"); } catch (Exception ex) { ex.printStackTrace(); } } /** * 显示本地图片和文字混合的Html 内容 */ private void localHtmlImage() { try { String data = "测试本地图片和文字混合显示,这是APK 里的图片"; // SDK1.5 本地文件处理(不能显示图片) // WebView.loadData(URLEncoder.encode(data, encoding), mimeType, // encoding); // SDK1.6 及以后版本 // WebView.loadData(data, mimeType, encoding); // 本地文件处理(能显示图片) WebView.loadDataWithBaseURL("about:blank", data, mimeType, encoding, ""); } catch (Exception ex) { ex.printStackTrace(); } }}
二、Android WebView入门
本章主要通过简单的例子演示如何使用WebView.
2.1Android编写简单的WebView
在android界面中如果使用WebView,往往可以复用服务器端的内容。先写个简单的WebVie实现。
非常简单,直接在adt 默认项目上加的.加了个WebView,访问我的博客首页.
本章将讲解深入一些的WebView技术,比如和js交互,和本地文件,缓存,WebView控件定制等。
3.1Android利用WebView实现在js中调用android代码
在java或android中,接口占有很大比重,做程序员当然要对接口了解了。android和js看似牛马不相及,但是由于WebView的连接在js中就能够调用android写的代码实现android的功能!android和js就像java和c/c++靠jni连接似的,二者也是靠接口连接。
1、首先简述WebView、WebViewClient、WebChromeClient之间的区别:
在WebView的设计中,不是什么事都要WebView类干的,有些杂事是分给其他人的,这样WebView专心干好自己的解析、渲染工作就行了。WebViewClient就是帮助WebView处理各种通知、请求事件等,WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title.
2、功能实现:利用android中的webview加载一个html网页,在html网页中定义一个按钮,点击按钮弹出toast。
3、实现步骤:
1)定义一个接口类,将上下文对象传进去,在接口类中定义要在js中实现的方法。
2)在assets资源包下定义一个html文件,在文件中定义一个button。button的点击事件定义为一个js函数。
3)在xml中定义一个WebView组件,在活动类中获取WebView并对WebView参数进行设置,此处特别注意要设置WebView支持js且将定义的js接口类添加到WebView中去,此后在js就可以利用该接口类中定义的函数了。即:
4)利用WebView加载本地html文件的方法是:myWebView.loadData(htmlText,"text/html","utf-8");此处的htmlText是以字符串的方式读取assets包下的html中的内容。
4、实现利用返回键回到上一页:
设置webview的按键监听,监听到期返回键并判断网页是否能够返回,利用webview的goBack()返回到上一页。
3.2 Android WebView缓存
在 项目中经常会使用到WebView控件,当加载html页面时,会在data/data/应用package目录下生存database与cache两个文件夹如下如所示:
请求的url 记录是保存在WebViewCache.db,而url 的内容是保存在WebViewCache 文件夹下.
第二步:在assets 目录下新建一个html 文件,命名为index.html
此时我们在WebViewCache.db 里的cache.table 里多了一条记录如下图所示:
3.3 Android WebView删除缓存
【eoe Android特刊】第二十四期Android WebView相关推荐
- 智能化软件开发微访谈·第二十四期 大模型时代的智能化软件生态(讨论汇编)...
CodeWisdom "智能化软件开发沙龙是由CodeWisdom团队组织的围绕智能化软件开发.数据驱动的软件开发质量与效能分析.云原生与智能化运维等相关话题开展的线上沙龙,通过微信群访谈交 ...
- 数据库管理-第二十四期 数据库设计-硬件篇(20220610)
数据库管理 2022-06-10 第二十四期 数据库设计-硬件篇 1 CPU 2 内存 3 存储 4 网络 5 总结 下期预告: 第二十四期 数据库设计-硬件篇 上次与这次的更新间隔比之前短多了,主要 ...
- 机器人按照给定的指令c语言,【高训工控】专业课堂第二十四期——工业机器人调试基础:程序的构造与组成...
原标题:[高训工控]专业课堂第二十四期--工业机器人调试基础:程序的构造与组成 大家好,欢迎来到[高训工控]专业课堂第二十四期,本期为大家带来--工业机器人调试基础:程序的构造与组成 在之前的文章中有 ...
- iOS摸鱼周报 第二十四期
本期概要 话题:跟一位同学聊一下最近的面试感受. Tips:设计 OC 版本的 defer 功能,使用现有证书创建 Fastlane match 格式加密文件. 面试模块:离屏渲染相关知识点. 优秀博 ...
- 笑话集原创笑话精品展第二十四期
1.有一个多次在大巴车上实施的罪犯在法庭上受审. 法官:这位被告,公诉机关指控你在客车上用暴力.控吓等不正当手段强行夺取他人钱财,你可知道你的行为已构成什么犯罪行为? 罪犯:知道. 法官:什么罪? 罪 ...
- Android第二十四期 - 游戏公告跑马灯效果
代码已经整理好,效果如下: 地址:http://down.51cto.com/data/1887395 本文转自 吴雨声 51CTO博客,原文链接:http://blog.51cto.com/lian ...
- Android第三十四期 - 极光推送
代码已经整理好,参照官网的文档很快你会可以配置出来,如下效果:
- 【第二十四期】golang 一年经验开发 富途
他们家是按题目来的,从一个小题目慢慢延伸着问,由浅入深,问到你换题为止. 第一题 给了一个网址,解释一下浏览器填入这个网址后发生了什么? TCP为什么要三次握手四次挥手? 502是什么? 如果出现50 ...
- 第二十四期:管理 | 成功领导远程IT团队的7个技巧
管理虚拟工作环境需要各种真实世界的技能和工具.以下是激发创造力和生产力的策略.为了在日益缺乏人才和竞争激烈的IT世界中取得成功,越来越多的企业开始依赖于地理上分散的劳动力. 作者:John Edwar ...
最新文章
- 自学笔记——Python内置的处理字符串的函数
- SpringCloud服务消费者第一次调用出现超时问题的解决方案
- -Wl,-rpath=
- wxWidgets:持久对象概述
- 教你如何使用Redis:[7]redis常用命令
- springboot 多数据源 读写分离 AOP方式
- Windows - Windows下安装MSI程序遇到2503和2502错误
- MYSQL执行sql时报错:Table 'performance_schema.session_status' doesn't exist解决办法
- angular 关闭当前页_angular刷新当前页 angularjs页面不刷新的解决办法 - 电脑常识 - 服务器之家...
- 微信小程序下载图片保存到本地
- FFmpeg之编译ffplay(十四)
- AlphaGo增强式学习算法:实现‘高手指点’特效
- 交直流配电网潮流计算matlab,干货丨交直流混合配电网潮流计算(含分布式电源)...
- 如何识别图片中的文字?三种方法轻松搞定
- 记DeeCamp 2019夏面试
- 小米,红米 root Magisk(面具)安装教程
- 南方电网两栖机器人_南方电网首个作业级水下机器人落户海南 为海底电缆“护驾”...
- 201.微信公众号开发【文本消息】
- leetcode:954. 二倍数对数组
- 【机器人学】平面2R机器人(六)——MATLAB仿真