MyException - 我的异常网
当前位置:我的异常网» Web前端 » Android-WebView应用

Android-WebView应用

www.MyException.Cn  网友分享于:2013-07-21  浏览:125次
Android-----WebView使用

在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对象。

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, KeyEvent event) {       
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {       
            mWebView.goBack();       
                   return true;       
        }       
        return super.onKeyDown(keyCode, event);       
    }

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

  看一个实例:

public class WebViewDemo extends Activity {        
    private WebView mWebView;       
    private Handler mHandler = new Handler();       
       
    public void onCreate(Bundle icicle) {       
        super.onCreate(icicle);       
        setContentView(R.layout.webviewdemo);       
        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="android_normal.png" mce_src="android_normal.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的目的。

?import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.AlertDialog.Builder; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.View; 
import android.webkit.JsPromptResult; 
import android.webkit.JsResult; 
import android.webkit.WebChromeClient; 
import android.webkit.WebStorage; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
  
public class WebviewTestActivity extends Activity { 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
          
        final WebView wv = new WebView(this); 
        // 覆盖默认后退按钮的作用,替换成WebView里的查看历史页面 
        wv.setOnKeyListener(new View.OnKeyListener() { 
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) { 
                if (event.getAction() == KeyEvent.ACTION_DOWN) { 
                    if ((keyCode == KeyEvent.KEYCODE_BACK) && wv.canGoBack()) { 
                        wv.goBack(); 
                        return true; 
                    } 
                } 
                return false; 
            } 
        }); 
        // 设置支持Javascript 
        wv.getSettings().setJavaScriptEnabled(true); 
        wv.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
        wv.getSettings().setDatabaseEnabled(true); 
wv.getSettings().setDatabasePath("/data/data/com.xinze.joke/databases"); 
        // 创建WebViewClient对象 
        WebViewClient wvc = new WebViewClient() { 
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) { 
                wv.loadUrl(url); 
                // 记得消耗掉这个事件。给不知道的朋友再解释一下,Android中返回True的意思就是到此为止吧,事件就会不会冒泡传递了,我们称之为消耗掉 
                return true; 
            } 
        }; 
        // 设置WebViewClient对象 
        wv.setWebViewClient(wvc); 
        // 创建WebViewChromeClient 
        WebChromeClient wvcc = new WebChromeClient() { 
            // 处理Alert事件 
            @Override
            public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { 
                // 构建一个Builder来显示网页中的alert对话框 
                Builder builder = new Builder(WebviewTestActivity.this); 
                builder.setTitle("笑死不偿命"); 
                builder.setMessage(message); 
                builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { 
                    @Override
                    public void onClick(DialogInterface dialog, int which) { 
                        result.confirm(); 
                    } 
                }); 
                builder.setCancelable(false); 
                builder.create(); 
                builder.show(); 
                return true; 
            } 
            // 处理Confirm事件 
            @Override
            public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { 
                Builder builder = new Builder(WebviewTestActivity.this); 
                builder.setTitle("删除确认"); 
                builder.setMessage(message); 
                builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { 
                    @Override
                    public void onClick(DialogInterface dialog, int which) { 
                        result.confirm(); 
                    } 
                }); 
                builder.setNeutralButton(android.R.string.cancel, new AlertDialog.OnClickListener() { 
                    @Override
                    public void onClick(DialogInterface dialog, int which) { 
                        result.cancel(); 
                    } 
                }); 
                builder.setCancelable(false); 
                builder.create(); 
                builder.show(); 
                return true; 
            } 
            // 处理提示事件 
            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, 
                    JsPromptResult result) { 
                // 看看默认的效果 
                return super.onJsPrompt(view, url, message, defaultValue, result); 
            } 
            @Override
               public void onExceededDatabaseQuota(String url, String 
                       databaseIdentifier, long currentQuota, long estimatedSize, long
                       totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { 
                                       quotaUpdater.updateQuota(204801); 
                                   } 
        }; 
//        wv.loadUrl("http://mrdoob.com/projects/chromeexperiments/ball_pool/"); 
//        wv.loadUrl("http://www.theshodo.com/Write"); 
        wv.loadUrl("http://192.168.1.107:8888/MBPHtmlClient/"); 
          
        // 设置setWebChromeClient对象 
        wv.setWebChromeClient(wvcc); 
        setContentView(wv); 
    } 
  
} 

 

 

文章评论

一个程序员的时间管理
一个程序员的时间管理
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
编程语言是女人
编程语言是女人
如何成为一名黑客
如何成为一名黑客
程序员和编码员之间的区别
程序员和编码员之间的区别
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
 程序员的样子
程序员的样子
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
鲜为人知的编程真相
鲜为人知的编程真相
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
漫画:程序员的工作
漫画:程序员的工作
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员应该关注的一些事儿
程序员应该关注的一些事儿
Java程序员必看电影
Java程序员必看电影
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员必看的十大电影
程序员必看的十大电影
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
为什么程序员都是夜猫子
为什么程序员都是夜猫子
我是如何打败拖延症的
我是如何打败拖延症的
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员都该阅读的书
程序员都该阅读的书
那些争议最大的编程观点
那些争议最大的编程观点
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
旅行,写作,编程
旅行,写作,编程
每天工作4小时的程序员
每天工作4小时的程序员
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员的鄙视链
程序员的鄙视链
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
10个调试和排错的小建议
10个调试和排错的小建议
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有