前言

当经常需要更换样式,产品迭代,那么我们应该考虑hybrid混合开发,上层使用Html&Css&JS做业务开发,底层透明化、上层多多样化,这种场景非常有利于前端介入,非常适合业务快速迭代.

webview

app有时需要去替换我们app的html、css……,文件非常多,需要我们在app启动的时候从服务器下载zip包,解压,这过程当然也需要进行版本管理,下载前可以进行版本对比,进行版本更新

file协议

通过file://从本地加载

Hybrid和H5

  • hybrid开发成本、运营成本相对较高
  • hybrid运行相对流畅、H5还会有短暂的加载
  • hybrid适合产品型、H5适合运营

JS和客户端通信

WebViewJavascriptBridge

  • 在Android中引用控件
 <!-- webview 演示web调用Java -->
<com.github.lzyzsd.jsbridge.BridgeWebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.github.lzyzsd.jsbridge.BridgeWebView>

  

<com.kingdee.k3.scm.wms.core.widget.webview.BridgeWebView
android:id="@+id/bwv_detail"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1">
</com.kingdee.k3.scm.wms.core.widget.webview.BridgeWebView>
  • 加载H5页面

  

//Android向js端发送数据 调用webview callback
webView.callHandler("functionInJs", "data from Java", new CallBackFunction() { @Override
public void onCallBack(String data) {
// TODO Auto-generated method stub
Log.i(TAG, "reponse data from js " + data);
} });

  

例如//此时为新增数据
mWebView.callHandler("addBill", mPresenter.getAddNewDataParams(), data -> {
//发送给客户端成功后
Timber.i("addDatal", "handler = addData, data from web = " + data);
});

  

  • js调用Android
js端
//调用本地java方法
window.WebViewJavascriptBridge.callHandler(
'submitFromWeb'
, {'param': str1}
, function(responseData) {
document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData
}
);

  

android端

//必须和js同名函数,注册具体执行函数,类似java实现类。
webView.registerHandler("submitFromWeb", new BridgeHandler() { @Override
public void handler(String data, CallBackFunction function) { String str ="这是html返回给java的数据:" + data;
// 例如你可以对原始数据进行处理
makeText(MainActivity.this, str, LENGTH_SHORT).show(); Log.i(TAG, "handler = submitFromWeb, data from web = " + data);
function.onCallBack( str + ",Java经过处理后截取了一部分:"+ str.substring(0,5));
} });

  

Schema协议

weixin://dl/general
weixin://dl/favorites 收藏
weixin://dl/scan 扫一扫
weixin://dl/feedback 反馈
weixin://dl/moments 朋友圈
weixin://dl/settings 设置
weixin://dl/notifications 消息通知设置
weixin://dl/chat 聊天设置
weixin://dl/general 通用设置
weixin://dl/officialaccounts 公众号
weixin://dl/games 游戏
weixin://dl/help 帮助
weixin://dl/feedback 反馈
weixin://dl/profile 个人信息
weixin://dl/features 功能插件

  

模拟扫一扫功能

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" name="viewport" content="width=device-width,user-scalable=1">
<title>Schema</title>
</head>
<body>
<button id="btn">扫一扫</button>
<script type="application/javascript">
function invokeScan() {
window['_invoke_scan_callback_'] =function (results) {
alert(results);
}
var iframe=document.createElement('iframe');
iframe.style.display='none';
iframe.src='weixin://dl/scan?k1=v1&callback=_invoke_scan_callback_';
var body =document;
body.appendChild(iframe);
setTimeout(function(){
body.removeChild(iframe);
iframe=null;
})
}
document.getElementById('btn').addEventListener('click',function(){
invokeScan();
})
</script>
</body>
</html>

简单封装

(function(window){
function invokeAppShare(data,callback){
_invoke_app('share',data,callback)
}
function invokeAppScan(data,callback){
_invoke_app('scan',data,callback)
}
window.invoke={
share:invokeAppShare,
scan:invokeAppScan
}
var schema ="ctapp://utils"
window._invoke_app =function(type,data,callback){
switch(type){
case window.invokeType.SHARE:
schema= '/'+window.invokeType.SHARE
//分享
break;
case window.invokeType.SCAN:
//扫码
break;
}
schema += '?type=app'
for(var key in data){
if(data.hasOwnProperty(key)){
schema+= '&' +key +'=' +data[key]
}
}
var callbackName='';
if(typeof callback === 'string'){
callbackName=callback
}else{
callbackName= callback+ Data.now().toString()
window[callbackName] =callback
}
schema+='&callback='+callbackName;
var iframe=document.createElement('iframe');
iframe.style.display='none';
iframe.src=schema;
var body =document;
body.appendChild(iframe);
setTimeout(function(){
body.removeChild(iframe);
iframe=null;
})
}
})(window)

  

 window.invokeType={
SHARE:'share',
SCAN:'scan'
}

  调用

document.getElementById('btn').addEventListener('click',function(){
window.invoke.scan({k1:'v1'},function () { });
})

  

闲谈Hybrid的更多相关文章

  1. Hybrid App技术批量制作APP应用与跨平台解决方案

    前言 简单的聊一聊我开发了4年之久的Hybrid App(混合模式移动应用)平台开发,目前一直在持续开发与维护,支持无编程快速开发! 其本意也不是要吹捧前端有多么强大,只是用自己的实际项目阐述下对于前 ...

  2. 利用C#开发移动跨平台Hybrid App(一):从Native端聊Hybrid的实现

    0x00 前言 前一段时间分别读了两篇博客,分别是叶小钗兄的<浅谈Hybrid技术的设计与实现>以及徐磊哥的<从技术经理的角度算一算,如何可以多快好省的做个app>.受到了很多 ...

  3. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

  4. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  5. 浅谈Hybrid技术的设计与实现

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发 ...

  6. OpenStack 企业私有云的若干需求(4):混合云支持 (Hybrid Cloud Support)

    本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...

  7. Hybrid APP混合开发的一些经验和总结

    http://www.cnblogs.com/kingplus/p/5588339.html 写在前面: 由于业务需要,接触到一个Hybrid APP混合开发的项目.当时是第一次接触混合开发,有一些经 ...

  8. Hybrid App经验解读 一

    郑昀编纂 关键词:Hybrid,Zepto,Fastclick,Backbone,sui,SPA,pushState,跨域,CORS click 事件还是 tap 事件? Zepto 的 show/h ...

  9. 【转载】用Ionic开发hybrid APP

    使用phonegap开发APP的优劣在此不必细说,快速,简单,跨平台,以及随着iOS,Android本身对webview优化所带来的不错的性能,便是其独有的优势.而且私以为在目前激烈而又变化快速的移动 ...

随机推荐

  1. Python入门-生成器和生成器表达式

    昨天我们说了迭代器,那么和今天说的生成器是什么关系呢? 一.生成器 什么是生成器?说白了生成器的本质就是迭代器. 在Python中中有三种方式来获取生成器. 1.通过生成器函数 2.通过各种推导式来实 ...

  2. Hadoop序列化程序报错

    这个错误指向序列化类,注意实现的Read和Wirte顺序一定要一致,并且要使用基本类型,不要使用包装类. java.lang.Exception: java.io.EOFException at or ...

  3. Java集合排序

    [ 1.对普通的包装类基本数据类型的list数组排序(Integer,Long,Double) ] Collections.sort(List list) [例] List<Long> m ...

  4. Android之自定义View以及画一个时钟

    https://www.2cto.com/kf/201509/443112.html 概述: 当Android自带的View满足不了开发者时,自定义View就发挥了很好的作用.建立一个自定义View, ...

  5. html5之hash

    http://blog.csdn.net/u012028371/article/details/67636395 原文:https://www.studyscript.com/Post/index/i ...

  6. png的故事:隔行扫描算法

    转载自AlloyTeam:http://www.alloyteam.com/2017/06/the-story-of-png-deinterlacing-algorithm/ 前言 前文已经讲解过如何 ...

  7. linux压缩

    zip:打包 :zip something.zip something (目录请加 -r 参数)解包:unzip something指定路径:-d 参数tar:打包:tar -zcvf somethi ...

  8. 什么是git subcommand,如何创建git子命令?

    大多数git用户知道如何在git中创建一个alias以便更便利地使用相关命令.很少有人知道至少不会好好利用的是:你实际上可以为Git创建扩展或者plugin,以便上git完成任何你希望完成的工作.这就 ...

  9. SQL Server 没有足够的内存继续执行程序 (mscorlib)的解决办法

    问题: SQL Server 执行大脚本时,出现如下提示信息: 解决方法: 使用 sqlcmd.exe 导入 1.win + r,输入 cmd 进入 C:\Program Files\Microsof ...

  10. XISE菜刀V13.0 官网版 XISE菜刀VIP破解版 XISE官网

    诠释: 1. 破解VIP登陆限制 2.去后门 (自查) 下载地址 :https://pan.baidu.com/s/1eR2rUOM 查毒地址:http://a.virscan.org/a3983f3 ...