闲谈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优化所带来的不错的性能,便是其独有的优势.而且私以为在目前激烈而又变化快速的移动 ...
随机推荐
- js权威指南学习笔记(四)对象
1.创建对象 (1).通过对象直接量的方式创建 说明:对象直接量是由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来. 如: 5 5 ...
- 为TextView增加onclick
必须添加上 android:clickable="true"
- eclipse安装checkStyle
今天用eclipse mars 安装checkstyle 代码测试工具,安装完后重启竟然没有,最后发现原来是 自己安装的步骤错了,记录下. 1. 我的版本是:Version: Mars.2 Relea ...
- win2008 svn 搬迁
公司说电脑不够用,要我们将本地开发用的服务器贡献出来给别人当办公电脑用..汗 将SVN从一个win2008服务器上搬迁到另一个win2008服务器上面. 先将服务器上面的配置好的svn 跟目录备份下来 ...
- SQL Server ->> 更改服务器时区对SQL Server Agent服务器的影响
昨天在把服务器的时区从PST改成UTC后,发现Job都不跑了.因为SQL Server Agent记录Job的历史运行时间是不区分时区的,也就是意味着我改后出现了最后一条运行记录比倒数第二条时间还要早 ...
- 【Leetcode】【Medium】Binary Tree Inorder Traversal
Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...
- DataS-2
2.4 证明对任意常数k,(称此式为公式A) 证明: ①当k1<k2时,,因此只需证明正数对公式A成立: ②当k=0或1时,显然有和满足公式A: ③假设k<i (i>1)时,都满足公 ...
- FQDN说明
以下摘自百度百科: FQDN:(Fully Qualified Domain Name)完全合格域名/全称域名,是指主机名加上全路径,全路径中列出了序列中所有域成员.全域名可以从逻辑上准确地表示出主机 ...
- Hadoop学习---Hadoop的MapReduce的原理
MapReduce的原理 MapReduce的原理 NameNode:存放文件的元数据信息 DataNode:存放文件的具体内容 ResourceManager:资源管理,管理内存.CPU等 Node ...
- February 21 2017 Week 8 Tuesday
To make each day count. 让每一天都物有所值. We always want to make our life meaningful, however, the acutal f ...