首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

Android-WebView应用

2012-07-20 
Android-----WebView使用在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView

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

??

?

这样在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);     }   } 

?

?

热点排行