Android-----WebView使用

转载 2012年03月26日 14:20:02

大部分内容为网上整理其它高人的帖子,现只作整理,用于查看:

在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件。 

什么是webkit
 

WebKit是Mac OS X v10.3及以上版本所包含的软件框架(对v10.2.7及以上版本也可通过软件更新获取)。 同时,WebKit也是Mac OS X的Safari网页浏览器的基础。WebKit是一个开源项目,主要由KDE的KHTML修改而来并且包含了一些来自苹果公司的一些组件。
 

传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS。不过, 随着JavaScript引擎的独立性越来越强,现在WebKit和WebCore已经基本上混用不分(例如Google Chrome和Maxthon 3采用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对象。

 

  1. mWebView.setWebViewClient(new WebViewClient(){       
  2.                     public boolean shouldOverrideUrlLoading(WebView view, String url) {       
  3.                         view.loadUrl(url);       
  4.                         return true;       
  5.                     }       
  6.         });   

 

 

 4.如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。

 

  1. public boolean onKeyDown(int keyCode, KeyEvent event) {       
  2.         if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {       
  3.             mWebView.goBack();       
  4.                    return true;       
  5.         }       
  6.         return super.onKeyDown(keyCode, event);       
  7.     }     

 

 

下一步让我们来了解一下android中webview是如何支持javascripte自定义对象的,在w3c标准中js有 window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以 为所欲为了。

  看一个实例:

 

  1. public class WebViewDemo extends Activity {        
  2.     private WebView mWebView;       
  3.     private Handler mHandler = new Handler();       
  4.        
  5.     public void onCreate(Bundle icicle) {       
  6.         super.onCreate(icicle);       
  7.         setContentView(R.layout.webviewdemo);       
  8.         mWebView = (WebView) findViewById(R.id.webview);       
  9.         WebSettings webSettings = mWebView.getSettings();       
  10.         webSettings.setJavaScriptEnabled(true);       
  11.         mWebView.addJavascriptInterface(new Object() {       
  12.             public void clickOnAndroid() {       
  13.                 mHandler.post(new Runnable() {       
  14.                     public void run() {       
  15.                         mWebView.loadUrl("javascript:wave()");       
  16.                     }       
  17.                 });       
  18.             }       
  19.         }, "demo");       
  20.         mWebView.loadUrl("file:///android_asset/demo.html");       
  21.     }       
  22. }   

 

 

我们看addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName(demo),作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.demo访问到绑定的java对象了。来看看在html中是怎样调用的。

 

  1. <html>       
  2.         <mce:script language="javascript"><!--     
  3.        
  4.                 function wave() {       
  5.                     document.getElementById("droid").src="android_waving.png";       
  6.                 }       
  7.              
  8. // --></mce:script>       
  9.         <body>       
  10.             <a onClick="window.demo.clickOnAndroid()">       
  11.                                 <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br>       
  12.                                 Click me!       
  13.             </a>       
  14.         </body>       
  15. </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的目的。


/**
* @author 张兴业
* 邮箱:xy-zhang#163.com
* android开发进阶群:278401545
*
*/

MyBatis -- 一步步教你使用MyBatis

1、建立开发环境 1.1  创建项目,java项目或者javaweb项目均可,如图: 1.2  添加所需要的jar包到项目lib目录下 一个MyBatis-3.2.4.jar包 一个驱动包...
  • u014034854
  • u014034854
  • 2015年08月05日 21:19
  • 3600

Nginx基本使用方法

Windows下Nginx+Tomcat整合的安装与配置
  • liuhailiuhai12
  • liuhailiuhai12
  • 2017年07月12日 13:52
  • 3953

MATLAB使用入门

作者:朱金灿来源:http://blog.csdn.net/clever101            初步学习了MATLAB的使用,发现MATLAB是一个很好的算法仿真工具。MATLAB也是一门语言,...
  • clever101
  • clever101
  • 2013年12月18日 14:00
  • 3317

GreenDao框架使用教程

github地址:https://github.com/greenrobot/greenDAO 1、首先建立一个java工程的Generator,注意是java工程不是android工程。导入free...
  • LuckChouDog
  • LuckChouDog
  • 2016年04月28日 16:27
  • 2624

matplotlib的基本使用方法

原文 使用python的科学计算库,达到快速计算的效果。标准的Python中用列表(list)保存一组值,可以当作数组使用。但由于列表的元素可以是任何对象,因此列表中保存的是对象的指针。这样一来,为...
  • u010602026
  • u010602026
  • 2017年03月30日 08:19
  • 2292

Endnote 基本使用教程

Endnote 使用教程一、 安装百度网盘:http://pan.baidu.com/s/1eSyufL4二、 使用教程1. 查找文献:从各大期刊检索网站上面选择需要的文献,使用endnote格式...
  • u012878602
  • u012878602
  • 2016年12月28日 14:41
  • 6193

freemarker的学习和使用

freemarker是一款模板引擎,它实现程序逻辑和页面设计的分离,完成静态文本的输出。它不是web开发框架,准确来说,它仅仅只是我们MVC开发下,视图层的一个组件而已。...
  • siqilou
  • siqilou
  • 2015年03月16日 20:00
  • 2669

log4j使用教程详解(怎么使用log4j2)

1. 去官方下载log4j 2,导入jar包,基本上你只需要导入下面两个jar包就可以了(xx是乱七八糟的版本号): log4j-core-xx.jar log4j-api-xx.jar ...
  • moonpure
  • moonpure
  • 2016年04月01日 10:22
  • 3054

IDEA使用教程

一、软件使用IDEA简体中文版教程百度云下载 密码:xnwv2.   IDEA2.1 IntelliJ IDEA 介绍IntelliJ IDEA官网 2.2 IDEA 安装安装过程简单,但是...
  • febis
  • febis
  • 2016年09月21日 15:47
  • 824

Junit使用教程(一)

几乎所有程序员都听说过Junit的大名,但不知真正懂得运用它的人有多少,我便是其中的一个小白。 知道Junit是用来测试的,但却把“宝刀”当成了“菜刀”用。为了从此不再菜鸟,特此总结整理了下Juni...
  • wangpeng047
  • wangpeng047
  • 2013年07月30日 15:09
  • 57274
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-----WebView使用
举报原因:
原因补充:

(最多只允许输入30个字)