标题: 商城开发笔记-13-Android与HTML5交互 [打印本页]

作者: 51黑bing    时间: 2016-3-22 17:30
标题: 商城开发笔记-13-Android与HTML5交互
一、WebAppHybrid AppNativeApp介绍与对比

     目前主流应用程序大体分为三类:Web App、HybridApp、 NativeApp。如下图所示:


首先,我们来看看什么是 Web App、HybridApp、 NativeApp。

1.Web APP例子:京东http://m.jd.com/
Web App指采用Html5语言写出的App,不需要下载安装。类似于现在所说的轻应用。生存在浏览器中的应用,基本上可以说是触屏版的网页应用。
优点
(1)开发成本低
(2)更新快
(3)更新无需通知用户,不需要手动升级
(4)能够跨多个平台和终端
缺点:
(1)临时性的入口
(2)无法获取系统级别的通知,提醒,动效等等
(3)用户留存率低
(4)设计受限制诸多
(5)体验较差

下图是WebAPP受到的限制:

在设计Web APP时,应当遵循以下几点:
1. 简化
o             简化不重要的动画/动效
o             简化复杂的图形文字样式

2. 少用
o             少用手势,避免与浏览器手势冲突
o             少用弹窗

3. 减少
o             减少页面内容
o             减少控件数量
o             减少页面跳转次数,尽量在当前页面显示

4. 增强
o             增强Loading时的趣味性
o             增强页面主次关系
o             增强控件复用性

2.Hybrid App例子:淘宝、饿了么、京东、QQ、微信等等。
HybridAPP指的是半原生半Web的混合类App。需要下载安装,看上去类似NativeApp,但只有很少的UI WebView,访问的内容是 Web 。
例如Store里的新闻类APP,视频类APP普遍采取的是Native的框架,Web的内容。
HybridApp 极力去打造类似于NativeApp 的体验,但仍受限于技术,网速,等等很多因素。尚不完美。

3.Native App
NativeAPP 指的是原生程序,一般依托于操作系统,有很强的交互,是一个完整的App,可拓展性强。需要用户下载安装使用。
优点:
(1)打造完美的用户体验
(2)性能稳定
(3)操作速度快,上手流畅
(4)访问本地资源(通讯录,相册)
(5)设计出色的动效,转场,
(6)拥有系统级别的贴心通知或提醒
(7)用户留存率高
缺点:
(1)分发成本高(不同平台有不同的开发语言和界面适配)
(2)维护成本高(例如一款App已更新至V5版本,但仍有用户在使用V2, V3, V4版本,需要更多的开发人员维护之前的版本,不然旧版本出问题了,用户可能就不用了)
(3)更新缓慢,根据不同平台,提交–审核–上线 等等不同的流程,需要经过的流程较复杂



二、技术特性对比
       由上图可见,WebAPP 的开发基于Html5语言。而Html5语言本身又有着不可避免的局限性。正是这些局限性的存在,使得Web App在体验中要逊于NativeApp


三、HybridApp开发中AndroidH5JS)交互
       既然混合APP现在这么流行,开发成本、体验都是开发技术中的首选,那么我们有必要来学习一下。

       Android中使用HTML开发的核心是使用WebView、原生APIJS的交互。
AndroidHTML5的交互有2种情况:

1.Android原生API 调用HTML页面中的JS代码
2.HTML页面中的JS代码调用Android原生API

为什么需要交互?因为HTML说到底只不过是一个静态的Layout,只有与原生API进行交互才能开发我们需要的功能。

下面开始介绍主要的核心步骤:

1.设置webView允许执行JS脚本:
webSettings.setJavaScriptEnabled(true);

2.添加通信接口(注意:InterfaceName要与JS中的名字一致)
webView.addJavascriptInterface(Interface,InterfaceName)

3. JS调用Android
InterfaceName.MethodName

4. Android调用JS(参数可以通过+“”+来拼接)
webView.loadUrl("javascript:functionName()");


例子代码:
/**
* 初始化WebView
*/
private void initWebView() {
    WebSettings settings = wv_detail.getSettings();
    //可以执行JS
    settings.setJavaScriptEnabled(true);
    //不阻塞网络图片
    settings.setBlockNetworkImage(false);
    //使能缓存
    settings.setAppCacheEnabled(true);
    appInterface = newAppInterface(this);
    //添加JS接口
    wv_detail.addJavascriptInterface(appInterface, "appInterface");
    //添加监听
    wv_detail.setWebViewClient(new MyWebViewClient());
    wv_detail.loadUrl(Constants.URL_GOOD_DETAIL);
}
/**
* AndroidJS通信的接口
*/
class AppInterface {
    private Context mCtx;
    public AppInterface(Context mCtx) {
        this.mCtx = mCtx;
    }
    //Android调用JS
    @JavascriptInterface
    public void showDetail(final long goodId) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                wv_detail.loadUrl("javascript:showDetail(" + goodId + ")");
            }
        });
    }
    //JS调用Android,这里只是在Android端写好的方法
    @JavascriptInterface
    public void buy(long goodId) {
        //做你需要做的事情
    }
    //
}
/**
* 监听
*/
class MyWebViewClient extends WebViewClient {
    //页面有链接点击时候调用
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        //自定义功能
        if (url.startsWith("nan://.....")) {
            //自定义功能,比如打电话,等
        }
        return super.shouldOverrideUrlLoading(view, url);
    }
    //页面加载完毕调用(因为JS有些方法需要在页面加载完毕的时候才能调用,不然没效)
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        appInterface.showDetail(mGood.getId());
    }
}

下面给出HTML中的JS代码:
<script>
    $(function(){
       $("#btnBuy").click(function(){
           var id = $("#txtWareId").val();
           //JS调用Android中的方法
           window.appInterface.buy(id);
       });
    })
    //Android调用的方法
    function showDetail(id){
        $("#txtWareId").val(id);
        $.ajax({
            url:"get?id="+id,
            success:function(ware){
                $("#ware_name").html(ware.name);
                $("#ware_img").attr("src",ware.imgUrl);
                $("#ware_price").html(" "+ware.price);
                $("#ware_sale_quantity").html(ware.sale);
            }
        })
    }
</script>


四、结束语
       好了,今天的笔记就到这里了,今天大年初一,楠妹妹祝大家猴年大吉O(_)O~~!至于高级的话,我们还需要去了解WebView的优化,学习前端的开发技术,WebViewClientWebChromeClient的使用与区别,等等。

WebViewClientWebChromeClient的区别:
WebViewClient主要帮助WebView处理各种通知、请求事件的
WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等。

看上去他们有很多不同,实际使用的话,如果你的WebView只是用来处理一些html的页面内容,只用WebViewClient就行了,如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient








欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1