hybrid方案背景

大部分业务都是在不停改变的,我们希望native不发布新版本就可以让线上用户使用新功能。我们要实现这样的方式,采用h5来实现就可以满足这一要求,准确说是native里提供一个装载h5的webview容器。单独使用h5完成整个应用和单独使用native来实现在体验上相差太大,所以考虑使用混合开发的方式。强调体验的地方使用native,其他地方使用h5,这样一来体验方面可以大幅提升。

h5与native如何交互

h5和native的交互通常是三种:

1、native提供方法,js调用native的方法。

2、native在本地注入js方法并且调用。

3、webview拦截请求,js发起自定义协议,native在请求里面拦截处理。

下面对分别进行一些介绍。

方案一

1、native注入对象(有一系列供js使用的方法)以及提供给js调用的名称。

webView.addJavascriptInterface(new HybridJsInterface(),"HybridJSInterface");

2、native提供可以供js调用的方法。

public class HybridJsInterface {

 
@JavascriptInterface

 final public void hello(String text) {

Log.i("method hello","text="+text);

}
}

3、js调用native的方法。

function hybrid(){

window.HybridJSInterface.hello("hello hybrid");


方案二

1、native注入js方法。(也可以是h5直接提供的方法)

//    function helloJs(){

// alert("hello js");

// }
String script = "function helloJs(){ alert('hello js');}";
//script是js方法对应的字符串
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

mWebContent.evaluateJavascript(script, null);

} else {

mWebContent.loadUrl("javascript:" + script);
}

}

2、native调用注入的js方法

  String handle = "helloJs()";

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

mWebContent.evaluateJavascript(handle, null);

} else {

mWebContent.loadUrl("javascript:" + handle);
}

注入和调用可以合并在一起,个人建议注入方法和调用方法分别执行。

方案三

1、native拦截h5发过来的请求协议(自定义协议)。

webview位置拦截的WebViewClient对象。

webView.setWebViewClient(new HybridWebViewClient());

HybridWebViewClient重写shouldOverrideUrlLoading方法

 public boolean shouldOverrideUrlLoading(WebView view, String url) {
Uri parse = Uri.parse(url);

String path = parse.getPath();
switch (path) {

//TODO

}
}

2、js那边发起请求协议。

方案分析

这三种方案单独使用都比较有局限性。

方案一的思路是native提前给h5实现好h5需要使用的方法,方法调用完全由h5控制,缺陷是h5调用的功能实现都由native实现,当h5页面中需要新功能的时候需要修改native才能支持。

方案二的思路是js提前给native提供方法,方法调用完全由native控制,缺陷是当js提供了新的方法那么需要修改native主动调用才能使用新功能。

方案三的思路是native拦截h5发过了的请求进行分发控制,js需要使用的功能是native已经提前准备好的,使用不同的url进行分发来使用,缺陷是h5使用新的功能那么需要修改native提供新功能。

单独使用这三种方案的共同缺点就是js和native都是一个单向的调用,相互太过依赖。要是三种方案都用上是不是可以解决问题呢,其实根本问题不在这里,而在于这些方案都没有办法动态扩展,也就是说native一旦完成之后那么单纯靠js是很难完成功能扩展的。我们需要一种可以适应一定程度动态扩展的方案,那就让h5作为项目主导,native提供服务。

hybrid设计

总体设计思路是h5控制整个业务流程以及交互流程。h5那边负责发命令并且回调,native负责响应命令。我是采用方案三来实现,客户端需要做的就是预先处理好这些命令(url)。既然是响应命令那么首先就需要把和业务无关的命令给整理出来,比较通用的包括下面内容(不一定全):

1、header控制。

heade的样式可以参考新闻类app的详情页(这里不截图),包括内容:左边按钮(多个),右边按钮(多个),主标题,副标题。

需要做的控制是左、右按钮是否显示、显示的文本及图标以及点击按钮的回调,主、副标题是否显示及显示内容。

2、页面刷新。

页面刷新用于内容改变之后h5主动通知native进行刷新。

3、页面跳转。

页面跳转分成两种一种是页面跳转到一个新的native页面,另一种是在webview内部做跳转。native的跳转包括内容:跳转动画、跳转目标页、目标页需要的参数。

4、loadingview/progressbar。

通常情况建议直接使用h5的进度显示。loadingview的控制包括:loadingview是否显示,loadingview的显示样式(通常只有一种样式)。

5、传感器数据。

传感器这部分不一定每个应用都需要。比如某些h5页面需要做活动,那么里面可能会用的摇一摇这样的功能。传感器的控制包括:地理位置、方向、震动、运动量。

6、h5离线包更新。

离线包的更新对于h5来说是一条更新命令。不过在native实现上面需要包括:离线包更新检查(版本比较)、离线包下载、离线包解压保存。

7、离线包开关。

是否使用离线数据。native需要做的是开启离线包命令之后需要把请求的url映射到本地文件缓存。

8、数据请求。

数据请求是指h5需要请求数据不通过直接网络访问,而是通过native自己的网络服务获取数据,尤其是在跨域的情况下很方便。

读者可以根据自己的需要实现这些功能,我这边已经实现了,但是因为时间少还没有来得及整理代码,在后期会放到github上。有任何问题欢迎讨论,留下qq群196761677、311536202。

hybrid开发设计的更多相关文章

  1. 有关 Hybrid 开发模式实践总结

    前言 随着公司业务不断发展,移动开发项目越来越多,项目任务时间紧,我们内部开发流程是以项目为导向,有别于一般公司对产品不断迭代的做法,但移动端开发人员资源有限,需要在不同项目之间做业务场景切换开发,就 ...

  2. Hybrid 开发

    主讲人:吴彬 要学习某个东西之前,我们首先要了解这个东西是什么?然后我们要了解这东西有什么用,有什么好处和弊端?最后我们要知道这东西怎么用? 简单点就是 ——是什么?有什么用?怎么用? 那么进入正题 ...

  3. Android Hybrid开发

    参考:谈谈Android App混合开发 Html 5和Native的交互 WebView 本来就支持js和Java相互调用,你只需要开启 WebView 的JavaScript脚本执行, 然后通过代 ...

  4. 关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】

    最近一直用ASP.NET MVC 4.0 +LINQ TO SQL来开发设计公司内部多个业务系统网站,在这其中发现了一些问题,也花了不少时间来查找相关资料或请教高人,最终都还算解决了,现在我将这些问题 ...

  5. 06-03 Java 面向对象思想概述、开发设计特征,类和对象的定义使用,对象内存图

    面向对象思想概述.开发设计特征 1:面向对象思想 面向对象是基于面向过程的编程思想. 面向过程:强调的是每一个功能的步骤 面向对象:强调的是对象,然后由对象去调用功能 2:面向对象的思想特点 A:是一 ...

  6. (2.15)Mysql之SQL基础——开发设计最佳规范

    (2.15)Mysql之SQL基础——开发设计最佳规范 关键字:mysql三大范式,mysql sql开发规范 分析: show profile.mysqllsla.mysqldrmpslow.exp ...

  7. Android开发设计 实验报告

    20162315 Android开发设计 实验报告 实验内容 1.安装 Android Stuidio,完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学 ...

  8. FS系统开发设计(思维导图)

      FS系统开发设计(思维导图) 最近做了一个小系统,公司应急,要对各个部门进行费用成本核算分摊,做运维,苦于无奈,简简单单的设计了一下,模仿用友ERP软件,首先对DB进行了初步设计,总体如下: 未完 ...

  9. Java开发设计——UML类图

    Java开发设计——UML类图 摘要:本文主要介绍了UML类图的相关知识. 简介 在UML中,类使用包含类名.属性和操作且带有分隔线的长方形来表示,类图分为三层. 第一层是类的名称,如果是抽象类或接口 ...

随机推荐

  1. 【Android】AppCompat V21:将 Materia Design 兼容到5.0之前的设备

    AppCompat V21:将 Materia Design 兼容到于5.0之前的设备 本篇文章翻译自Chris Banes(就职于Google,是Android-PullToRefresh,Phot ...

  2. atitit. groupby linq的实现(1)-----linq框架选型 java .net php

    atitit.  groupby linq的实现(1)-----linq框架选型 java .net php 实现方式有如下 1. Dsl/ Java8 Streams AP ,对象化的查询api , ...

  3. Yii2中系统定义的常用路径别名,如果获取web的url

    下面这些别名都是在Yii2里面系统定义的,可以直接拿来就用 '@yii' => '@yii/swiftmailer' => string 'C:\wamp\www\advanced\ven ...

  4. SmartThings物联网平台简介

    SmartThings是一个智能设备控制系统,它包括:SmartThings Cloud(云平台).SmartThings Hub(网关).SmartThings Mobile(手机客户端)以及各种关 ...

  5. 【地图API】收货地址详解2

    上次讲解的方法是: 在地图中心点添加一个标注,每次拖动地图就获取地图中心点,再把标注的位置设置为地图中心点.可参考教程:http://www.cnblogs.com/milkmap/p/6126424 ...

  6. SSH集成步骤

    1 在goodspeed.web.model下建立*类(空的构造,属性访问与设置),同时配置*.hbm.xml文件与数据库挂起来2 在goodspeed.web.dao建立*Dao和*Daoimpl类 ...

  7. win8 中使用第三方无线网卡出现无线连接受限解决办法

    无线路由  无线网络模式基本设置 模式改为 11bg mixed , 然后在 win8 的设备管理器中找到无线路由 不知道 win8 有些地方兼容性做的不是很到位,我的 xp不做任何配置可以正常使用.

  8. GTD时间管理(2)---管理收集箱

    通过上面一篇文章,相信大家对GTD收集有了原理大致的了解,如果大家对收集不是很了解,可以去看一下. 当我们收集到很多想法和事情之后,在晚会的时候必须要清空收集箱,否则收集箱会堆积如山,最终收集箱成了垃 ...

  9. WIN7只能上QQ打不开网页,使用CMD输入netsh winsock reset

    此类问题可以用腾讯电脑管家电脑诊所一键修复,请点击上方的[立即修复]即可. 附:手动修复步骤(来源:腾讯电脑管家电脑诊所,自动修复请点击上方的[立即修复])方案一:手动设置DNS(说明:如果您使用DN ...

  10. Jmeter调试工具---HTTP Mirror Server

    之前我介绍过Jmeter的一种调试工具Debug Sampler,它可以输出Jmeter的变量.属性甚至是系统属性而不用发送真实的请求到服务器.既然这样,那么HTTP Mirror Server又是做 ...