使用HTML5开发Android本地应用(一)


HTML5是现在最热门的技术之一,Android自带的WebKit浏览器对于HTML5有着不错的支持,而各种浏览器的最新版本都开始普遍的支持HTML5。使用HTML5开发手机应用的主要好处有两个:一个是应用可以跨平台,包括不同的手机平台和PC;二是可以从服务器下载应用的内容,但是不依赖于后台Server也可以运行,可以把Web应用和本地应用更好的结合在一起。

这一系列文章的目的在于研究和实验使用HTML5开发Android本地应用的优缺点和可行性,包括HTML5本身的优点和局限性,网页部分和应用环境之间的交互,以及我们可以怎样控制和修改浏览器插件的行为,把它和手机本身的环境更好的结合在一起。

首先是把一个WebView嵌入到应用界面中,建立起它和环境的交互,然后加载一个简单的HTML5页面。要被加载的HTML文件放在asset目录中,可以通过url "file:///android_asset/index.html"来加载。这个页面的作用只是用canvas画一个简单的图形。

String path = "file:///android_asset/index.html";String TAG = "WebClientDemo";boolean isLoadResources = true;WebView mWebView;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.webview1);init();mWebView.loadUrl(path);}

初始化WebView,设置参数,关键是设置语言为UTF-8和保证支持JavaScript

mWebView = (WebView) findViewById(R.id.myWebView1);mWebView.setBackgroundColor(Color.WHITE);mWebView.getSettings().setDefaultTextEncodingName("UTF-8");mWebView.getSettings().setSupportZoom(true);mWebView.getSettings().supportMultipleWindows();mWebView.getSettings().setJavaScriptEnabled(true);mWebView.clearView();

WebViewClient负责截获并修改加载网页过程中的各种事件。首先给mWebView设置一个新的WebViewClient,然后重写函数shouldOverrideUrlLoading。这么做的原因保证点击WebView插件中的Url链接的时候,仍然是在WebView插件中显示页面,而不是调用系统的网络浏览器。

mWebView.setWebViewClient(new WebViewClient() {// Intercepts url loadingpublic boolean shouldOverrideUrlLoading(WebView view, String url) {view.loadUrl(url);return true;}                                                ...                }

以下是在WebViewClient中,截获并且修改其它的事件行为的代码。例子代码中截获的事件包括网页加载前,加载后,错误,重复提交,加载资源等。比如,发生网页错误的时候,可以用自己的错误信息取代浏览器插件的错误提示。

// Intercepts the resource loading events@Overridepublic void onLoadResource(WebView view, String url) {if (!isLoadResources) {Log.i(TAG, "Block resource loading:" + url);return;} else {Log.i(TAG, "Continue resource loading:" + url);super.onLoadResource(view, url);}}// Intercepts error messagepublic void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {Log.i(TAG, failingUrl);Toast.makeText(activity, "网页错误: " + errorCode + " 网页不可用",Toast.LENGTH_LONG).show();}// Intercepts form resubmissionpublic void onFormResubmission(WebView view, Message dontResend,Message resend) {Log.i(TAG, "Resubmission");Toast.makeText(activity, "不可重复提交,按Back回到上级网页",Toast.LENGTH_SHORT).show();}// Intercepts page started eventpublic void onPageStarted(WebView view, String url, Bitmap favicon) {Log.i(TAG, "Page load start");}// Intercepts page finished eventpublic void onPageFinished(WebView view, String url) {Log.i(TAG, "Page load finish");}

在Webview下,当按下Back键时,需要调用WebView中Back,访问历史页面,当没有历史页面的时候提示是否要退出。

需要在当前Activity中重写onKeyDown函数,处理Back事件。

public boolean onKeyDown(int keyCode, KeyEvent event) {// Forwards the back key event to browser pluginif ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {String url;mWebView.goBack();return true;}// Pops up a dialog before exitif ((keyCode == KeyEvent.KEYCODE_BACK) && (!mWebView.canGoBack())) {new AlertDialog.Builder(this).setTitle(R.string.title).setMessage(R.string.quit_desc).setNegativeButton(R.string.cancel,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {}}).setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int whichButton) {android.os.Process.killProcess(android.os.Process.myPid());}}).show();return true;}return super.onKeyDown(keyCode, event);}

WebChromeClient负责处理Javascript的对话框,网站图标,加载进度条等。下面的代码,在Activity上添加一个加载网页的进度条

mWebView.setWebChromeClient(new WebChromeClient() {public void onProgressChanged(WebView view, int progress) {activity.setProgress(progress * 100);}});

退出提示框



HTML5显示效果和页面代码:

  <script type="application/x-javascript">    function drawText() {      var canvas = document.getElementById("canvas");      if (canvas.getContext) {        var ctx = canvas.getContext("2d");        var message = "First HTML5 page"        ctx.fillStyle = "#FF0000";        ctx.font = "30px serif";var xPosition = 20;var yPosition = 30;                ctx.fillText (message,xPosition,yPosition);      }    }  </script> <body onload="drawText();">   <canvas id="canvas" width="300" height="300"></canvas> </body>

http://community-china.developer.motorola.com/t5/MOTODEV-博客/bg-p/MOTODEV_Blog

更多相关文章

  1. Android:浅谈app加载H5
  2. android app -- Picasso 二级缓存加载图片,可控制加载图片大小(附
  3. 解决FLIR One Android Demo项目加载问题
  4. Android 页面销毁、重建与数据恢复
  5. Android图片加载库:最全面解析Glide用法
  6. Android异步加载图像小结----演化理解 Android 异步
  7. Android打造不一样的新手引导页面(二)

随机推荐

  1. AndroidManifest.xml 中application 的 a
  2. Android键盘属性
  3. android studio 打包 so 库
  4. Android实用小技巧
  5. Android(安卓)Drawable缓存
  6. TextView的众多使用
  7. 【翻译】(1)Android(安卓)NDK Overview
  8. Android编译过程详解(二)
  9. Android版本和API Level对应关系
  10. android camera照片旋转90度