概述
目前主流应用程序大体分为三类
Web App
Web App是指采用Html5语言写出的App,不需要下载安装,类似于现在所说的轻应用,存在于浏览器中的应用,基本上可以说是触屏版的网页应用。
优点
- 开发成本低
- 更新快
- 更新无需通知用户,不需要手动升级
- 能够跨多个平台和终端
缺点
- 临时性的入口
- 无法获取系统级别的通知,提醒,动效等
- 用户留存率低
- 设计受限制诸多
- 体验较差
Hybrid App
Hybrid App是半原生,半Web的混合类App。 需要下载安装,看上去类似NativeApp,但是只有很少的UI,大多用WebView,访问的内容是Web。
Native App
Native APP指的是原生程序,一般依托于操作系统,有很强的交互,是一个完整的App,可拓展性强。需要用户下载安装使用。
优点
- 打造完美的用户体验
- 性能稳定
- 操作速度快,上手流畅
- 访问本地资源(通讯录,相册)
- 设计出色的动效,转场,
- 拥有系统级别的贴心通知或提醒
- 用户留存率高
缺点
- 分发成本高(不同平台有不同的开发语言和界面适配)
- 维护成本高(例如一款App已更新至V5版本,但仍有用户在使用V2, V3, V4版本,需要更多的开发人员维护之前的版本,不然旧版本出问题了,用户可能就不用了)
- 更新缓慢,根据不同平台,提交–审核–上线 等等不同的流程,需要经过的流程较复杂
三者对比
Hybrid App开发中Android与H5(JS)交互
准备工作
- 打开assets中的Html。
mWebView = (WebView) findViewById(R.id.webview_test); mWebView.loadUrl("file:///android_asset/index.html");
- 打开SD卡中的Html
mWebView = (WebView) findViewById(R.id.webview_test); mWebView.loadUrl(“content://com.android.htmlfileprovider/sdcard/index.html”);
- 打开服务端指定Url的Html。
mWebView = (WebView) findViewById(R.id.webview_test); mWebView.loadUrl(“http://www.baidu.com”);
Android与Html的交互,实际就是与Js的交互。
分两种情况,原生调用Js,Js调用原生。
配置
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>测试网站</title> <script type="text/javascript"> function test(){ var name = document.getElementById("textName").value app.sayHello(name) <!--Js调用原生--> } <!--原生调用Js--> function showName(name){ document.getElementById("textName").value = name; } </script> </head> <body> <input id="textName"> <br/> <hr> <button onclick="test()">测试</button> </body> </html>
mWebView.loadUrl("file:///android_asset/index.html"); mWebView.getSettings().setJavaScriptEnabled(true); //开启支持JavaScript mWebAppInterface = new WebAppInterface(); //设置和原生和Js交互的接口 //参数:接口类,Js调用原生时需要的引用名(自定义命名) mWebView.addJavascriptInterface(mWebAppInterface, "app");
交互接口
class WebAppInterface { /** * Js 调用原生 */ @JavascriptInterface //一定加注解否则可能会报错 public void sayHello(String name) { if (!TextUtils.isEmpty(name)) { Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show(); } } /** * 原生调用Js */ public void showName(String name) { mWebView.loadUrl("javascript:showName('" + name + "')"); } }
完整交互代码
private void initView() { mWebView = (WebView) findViewById(R.id.webview_test); btn_test = (Button) findViewById(R.id.btn_test); mWebView.loadUrl("file:///android_asset/index.html"); mWebView.getSettings().setJavaScriptEnabled(true); //开启支持JavaScript mWebAppInterface = new WebAppInterface(); //设置和原生和Js交互的接口 //参数:接口类,Js调用原生时需要的引用名(自定义命名) mWebView.addJavascriptInterface(mWebAppInterface, "app"); btn_test.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mWebAppInterface.showName("测试"); } }); } class WebAppInterface { /** * Js 调用原生 */ @JavascriptInterface //一定加注解否则可能会报错 public void sayHello(String name) { if (!TextUtils.isEmpty(name)) { Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show(); } } /** * 原生调用Js */ public void showName(String name) { mWebView.loadUrl("javascript:showName('" + name + "')"); } }