闲谈Hybrid
前言
当经常需要更换样式,产品迭代,那么我们应该考虑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
//调用本地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的更多相关文章
- Hybrid App技术批量制作APP应用与跨平台解决方案
前言 简单的聊一聊我开发了4年之久的Hybrid App(混合模式移动应用)平台开发,目前一直在持续开发与维护,支持无编程快速开发! 其本意也不是要吹捧前端有多么强大,只是用自己的实际项目阐述下对于前 ...
- 利用C#开发移动跨平台Hybrid App(一):从Native端聊Hybrid的实现
0x00 前言 前一段时间分别读了两篇博客,分别是叶小钗兄的<浅谈Hybrid技术的设计与实现>以及徐磊哥的<从技术经理的角度算一算,如何可以多快好省的做个app>.受到了很多 ...
- 浅谈Hybrid技术的设计与实现第三弹——落地篇
前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...
- 浅谈Hybrid技术的设计与实现第二弹
前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...
- 浅谈Hybrid技术的设计与实现
前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发 ...
- OpenStack 企业私有云的若干需求(4):混合云支持 (Hybrid Cloud Support)
本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...
- Hybrid APP混合开发的一些经验和总结
http://www.cnblogs.com/kingplus/p/5588339.html 写在前面: 由于业务需要,接触到一个Hybrid APP混合开发的项目.当时是第一次接触混合开发,有一些经 ...
- Hybrid App经验解读 一
郑昀编纂 关键词:Hybrid,Zepto,Fastclick,Backbone,sui,SPA,pushState,跨域,CORS click 事件还是 tap 事件? Zepto 的 show/h ...
- 【转载】用Ionic开发hybrid APP
使用phonegap开发APP的优劣在此不必细说,快速,简单,跨平台,以及随着iOS,Android本身对webview优化所带来的不错的性能,便是其独有的优势.而且私以为在目前激烈而又变化快速的移动 ...
随机推荐
- canvas.addEventListener()
对 canvas 元素的事件监听用addEventListener()实现, 但是有一点缺陷是:canvas 不支持键盘事件,为了解决这个问题,可以采用以下两种方案: 方案一: key event - ...
- gitlab 创建ssh步骤
1.使用gitlab首先要创建ssh的公钥和私钥.创建ssh的步骤和命令如下: 打开git bash,我的是windows,切换到.ssh文件夹下.如果没有则创建.ssh(默认是没有这个文件夹的).检 ...
- Porting QML Applications to Qt 5
When porting QML-related code from Qt 4.8 to Qt 5, application developers should be aware that the Q ...
- 深入理解http协议的特点
HTTP 是一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点:1.支持客户/服务器模式:2.简单快速:3.灵活:4.无连接:5.无状态. 无连接 无连接的含义是限制每次连接只处理一个请求. ...
- 使用js时,如何获取系统当前时间并且得到格式为"yyyy年MM月"的日期
1.使用js时,如何获取系统当前时间并且得到格式为"yyyy年MM月"的日期: 1 var newdate = new Date(); 2 var nowyear = newdat ...
- Python学习---Python下[set集合]的学习
Set集合[可变]是一个无序的,不重复的数据组合,它的主要作用如下: 1. 去重,把一个列表变成集合,就自动去重了 2. 关系测试,测试两组数据之前的交集.差集.并集等关系 集合(set):把不同的元 ...
- CSS position属性 标签: css 2016-09-06 15:58 78人阅读 评论(0) 收藏
踩了position的坑,主要是因为对position属性理解不深. 以下是w3school中对position的解释: 可能的值 值 描述 absolute 生成绝对定位的元素,相对于 static ...
- Json.Net 中Linq to JSON的操作
Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和 ...
- 玩转Metasploit系列(第一集)
"如果我有七个小时的时间来砍树,那么我一定会花6个小时来磨我的斧头." –Abraham Lincoln ??这句话一直引导着我做事的思路,而且从未改变过.这篇文章翻译自Offen ...
- springMvc返回Json中自定义日期格式
(一)输出json数据 springmvc中使用jackson-mapper-asl即可进行json输出,在配置上有几点: 1.使用mvc:annotation-driven 2.在依赖管理中添加ja ...