转 施用HTML5开发Android本地应用(一)
使用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; @Override public 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 loading public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } ... }
以下是在WebViewClient中,截获并且修改其它的事件行为的代码。例子代码中截获的事件包括网页加载前,加载后,错误,重复提交,加载资源等。比如,发生网页错误的时候,可以用自己的错误信息取代浏览器插件的错误提示。
// Intercepts the resource loading events @Override public 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 message public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Log.i(TAG, failingUrl); Toast.makeText(activity, "网页错误: " + errorCode + " 网页不可用", Toast.LENGTH_LONG).show(); } // Intercepts form resubmission public void onFormResubmission(WebView view, Message dontResend, Message resend) { Log.i(TAG, "Resubmission"); Toast.makeText(activity, "不可重复提交,按Back回到上级网页", Toast.LENGTH_SHORT).show(); } // Intercepts page started event public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.i(TAG, "Page load start"); } // Intercepts page finished event public 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 plugin if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { String url; mWebView.goBack(); return true; } // Pops up a dialog before exit if ((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() { @Override public void onClick(DialogInterface dialog, int which) { } }) .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() { @Override public 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
相关推荐
- Android入门序言(一)之-Android应用开发入门五问(转)
- 【转】Android UI开发第二十四篇——Action Bar 添加Action Bar 删除Action bar 添加操作项 选择操作项: 使用分离式操作栏 导航栏使用应用图标 向应用程序上级页面导航 添加操作视窗 处理可折叠的操作视窗 添加一个操作提供器 使用ShareActionProvider类 创建一个自定义的操作提供器 添加导航选项标签 添加下拉式导航 设置操作栏的样式 高级样式
- 转 施用HTML5开发Android本地应用(一)
- HTML、CSS --chrome书签整理 CSS三栏布局——中间固定两边自适应宽度 负值之美:负值在页面布局中的应用 为什么图片资源放在cdn上面不会出现跨域访问呢?cdn的ip和你网站的ip不是不同的吗? CSS浮动属性Float详解 由浅入深漫谈margin属性 前端开发 IE 中的常用调试工具 提高Web页面的性能(一) 分类“网站优化”所有日志 图片垂直居中的使用技巧 如何快速定位页面中复杂 CSS BUG 问题 1个月成为HTML5前端工程师 Chrome渲染Transition时页面闪动Bug 整理:子容器垂直居中于父容器的方案 Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】 你需要了解的z-index世界 CSS margin属性与用法教程 高大上的 CSS 效果:Shape Blobbing HTML5 本地裁剪图片并上传至服务器(老梗) HTML5+CSS3+JQUERY 牛刀小试 仿3D圆柱图
- 用HTML5回开发一款android本地化App游戏-宝石碰碰
- Atitit.hybrid混合型应用 浏览器插件,控件的实现方式 浏览器运行本地程序的解决方案大的总结---提升用户体验and开发效率.. 1. 关键字 2. hybrid App 3. Web App、Hybrid App、Native APP对比 4. 实现方式activex Flash , 5. applet,Js , html5 6. NPAPI是电脑上大部分非ie浏览器都支持的一种浏览器扩展,类似ie的activex技术。 7. URL协议的方式(跨平台的),我们将某种URL的协议注册给某个程序来进行处理, 8. 二、插件检测 9. 参考
- [随想感悟] 面试时,问哪些问题能试出一个 Android 应用开发者真正的水平?【转自知乎】
- (转)heX——基于 HTML5 和 Node.JS 开发桌面应用 一、项目背景 二、用heX开发桌面应用的优势 三、如何用heX开始一个桌面应用程序 AlloyDesktop
- 转 android开发笔记之handler+Runnable的一个巧妙应用
- [分享]用delphi实现的由一颗五角星爆炸成多个五角星的奇效,代码仅6行
- 起步其他app