Android-----WebView使用

来源:互联网 发布:智慧云计算 编辑:程序博客网 时间:2024/06/05 15:31

在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就可以 为所欲为了。

  看一个实例:

view plaincopy to clipboardprint?
  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的目的。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机贴钢化膜边缘有气泡怎么办 苹果手机钢化膜边缘有气泡怎么办 手机膜里的水泡怎么办 膜贴好了有气泡怎么办 后档玻璃膜气泡怎么办 贴膜里面有灰尘怎么办 贴膜边缘不粘怎么办 贴膜时候的气泡怎么办 贴手机膜起泡了怎么办 手机膜起泡泡了怎么办 手机膜鼓起来了怎么办 贴膜中间有气泡怎么办 新车贴膜有气泡怎么办 贴手机膜进灰尘怎么办 贴手机膜有灰尘怎么办 华为mate10后机壳碎了怎么办 手机屏和壳分开了怎么办 oppoa33手机开不了机怎么办 7p背面刮花了怎么办 oppo手机左右两键失灵怎么办 苹果5s屏幕翘起怎么办 0pp0手机有点卡怎么办 手机用久有点卡怎么办 手机有点卡怎么办魅蓝 苹果6排线接反了怎么办 oppo手机解锁密码忘了怎么办 魅蓝5音量小怎么办 魅蓝5密码忘记了怎么办 魅蓝note3锁定了怎么办 魅族mx5系统铃声没有了怎么办 魅族主板坏了怎么办 魅族mx5螺丝滑丝怎么办 魅族魅蓝e手机被锁了怎么办 魅蓝e被锁机了怎么办 魅蓝3s卡顿怎么办 魅族note5玩王者荣耀卡怎么办 魅族手机内存不够怎么办 魅族手机音量小怎么办 魅族mx5指纹解锁失灵怎么办 魅族手机费电快怎么办 魅族mx4pro玩王者荣耀卡怎么办