写点什么

使用 Tabris 创建原生跨平台应用

  • 2013-08-14
  • 本文字数:3863 字

    阅读完需:约 13 分钟

Tabris 是第一个用于构建原生移动应用的跨平台开发的 Java 工具包。它通过量身定制的、原生的控件和功能提供原生的用户体验。

但到底原生的含义是什么呢?

目前开发移动应用程序时,现存的平台数量众多是一个真正的问题。

对终端用户来说能使用众多的硬件和软件是梦寐以求的,但对于开发人员来说是一场噩梦。

只要移动应用程序开发人员开发的应用运行在超过一个平台,他们就会面临一系列的挑战。

最困难的挑战之一是要有必需的专业知识。即使我们“只考虑”市场领先的平台 iOS 和 Android,这意味着以下几点:

  • 精通两种编程语言:Java 和 Objective-C。
  • 掌握两个不同平台的 API。
  • 规划一个(或两个)应用设计的时候需要同时考虑两个平台。

总之,如果要为每个平台单独开发“原生”应用,随着要支持的平台的增加,开发移动应用程序的精力也或多或少需要增加。幸运的是,跨平台的工具包提供了一种很好的替代方法。

目前,有两种不同类型的跨平台的工具包。一方面,是基于 HTML 的工具包,另一方面,是基于跨平台编译或解释原生控件和功能的工具包。

PhoneGap 很显然属于第一类并占有主导地位,它使用 HTML 显示用户界面。当开发简单的应用时,这种解决方案不容置疑的魅力在于其快速的开发速度。

然而,最近,HTML5 趋势已经失去了它的一些吸引力,主要是因为终端用户的不满和突发的故障,如 Facebook。

至于考虑到用户体验方面,当开发手机应用时,HTML5 会轻易成为一种负担。不像 Web 应用,移动应用通常拥有高度复杂的控件。虽然 HTML5 工具包如 jQuery Mobile 的提供了类似的操作系统控件的功能,为了这个目的,需要对若干个控件进行组合。在更复杂的用户界面的情况下,这将导致出现众多的 DOM 元素并可能会产生对应用程序性能产生负面影响。无论是否使用控件,大多数 HTML 用户界面没能提供满意的用户体验,因为应用的观感都不熟悉。从控件的观感到导航的概念和动画,都缺乏用户的熟悉感。

第二类的跨平台工具包使用操作系统的控件,从而避免了观感的问题。使用这种技术创建的应用程序在视觉上比 HTML 用户界面更接近原生界面。然而,这些解决方案也带来了各种挑战。

要成功开发一个原生的应用,仅显示原生窗口控件是不足够的。用户导航还必须反映特定平台的概念。在原应用开发的情况下,开发人员设计应用时,要具备相关平台设计的概念。在 IOS 中,这是“ViewController”的原则,对 Android 而言,则是“Activities ”和“ActionBar”。只有少数跨平台工具包抽象并统一这些概念。

这正是 Tabris 用武之地。基本上,Tabris 属于上述的第二类跨平台工具包。它通过 Java-API 抽象原生的控件和功能。其中包括简单的元素,如按钮或文本框,但也有更多复杂的元素,如树 / 列表或 swipe 控件。除了控件,它也提供了 Java-API 用于控制设备的摄像头或获得地理位置定位。Tabris 的另一个基本特征是抽象出本地导航概念,称为 Tabris UI。

UI 非常简洁且只由两个核心部件组成。它们是页面 (Page) 和行动类型 (Action types)。最好的解释这些类型的方法是使用截图。

(点击图片放大)

此图片显示了相同的应用在iOS 和Android 设备上显示的样子。该应用的实际内容是相同的。只有和特定平台框架整合部分是不同的。标记为红色的区域表示一个页面。一个页面是一种装载控件的容器。标记为绿色的区域表示两个动作。从概念上讲,一个动作代表用户可能的一次跟应用或页面相关的交互操作。

要使用这些类型去创建一个完整的应用,必须将它们互相连接。第一种连接称为流(flow)。流描述了可以以不同的方式放在一起的一系列页面的链。要创建这种流,页面必须承担特定的角色。可能的角色是顶层页面和普通页面。顶层页面,标记着流的开始并只出现一次。一个普通的页面可以在流中出现一次或多次,但不能出现在最开始。使用以下图片更容易解释。

(点击图片放大)

上面的图显示了一个典型的应用程序流。在这种情况下,应用程序由三个顶层网页和多个普通网页来组成。用户现在可以在各页之间导航,例如,通过使用一个动作。在这个阶段,重要的是,流可以以不同的顺序遍历,这在下面例子中会解释。

让我们假设想开发一个“书店应用”。在这种情况下,书是应用的核心元素。因此,用户必须能够轻松地浏览不同的书。给亚马逊带来可观的额外收入的一个特性是协同过滤。比如“买了这本书的客户,还买了另外的书”。有了这个功能,用户可以从一本书导航到另一本书的链接。此导航链的长度,不会受到限制。然而,无论是导航到前一本书或是回到起始页面都需要能反向导航的能力。

Tabris UI 的流能支持这种导航。流可以有任意的,非固定的深度。可以在任何时候向前导航。然而,这意味着,流的开始必须有固定的定义。在我们的书店例子中,那将会是一个畅销书的名单。

第二个概念,“动作”,也被连接到页面。通常情况下,一个动作封装了应用程序的功能。在书店的的例子中,可以是添加到购物篮或搜索的功能。这两项活动也直接描述了可能动作范围:动作包含页面或是全局范围的动作。它也与页面或整个应用程序关联。一个全局性的动作的例子就是搜索,因为它可以从应用的任何地方去使用。不同的是,当用户在一个书本的页上,只能往购物篮中增加一本书。

一个完整的书店应用的应用流可能看起来像这样:

(点击图片放大)

屏幕截图显示了相同的应用运行在Android 和iOS 上的情况。应用程序包括三个顶层网页:“所有书籍,畅销和我的最爱”。这些顶层页面每一页显示书籍清单。在选择时,某本书是在详细视图中显示的。在那里,终端用户可以访问更多的书籍或先睹为快。这个应用的代码可以放在 GitHub 上。要看这应用的实际效果,可以观看这个视频

在我们已经讨论了 Tabris UI 的导航概念后,我们也想讨论组成应用内在部分的控件。在这个过程中,Tabris 使用跨平台的控件工具包 SWT(标准挂件工具包)的特定 API。SWT 是轻量级的,广泛使用的,开源和使用 JFacede 的强大功能的 MVC 框架。例如,上面介绍的书店的列表视图可以通过短短的几行代码实现。

复制代码
public class BooksListPage extends AbstractPage
public void createContent( Composite parent ) {
TreeViewer viewer = new TreeViewer( parent, SWT.V_SCROLL );viewer.
setContentProvider( new BooksContentProvider() );
viewer.setLabelProvider( new BooksLabelProvider() );
addBookSelectionListener( viewer );
...
public class BooksContentProvider implements ITreeContentProvider {
public Object[] getElements( Object inputElement ) {
return books.toArray();
}
...
public class BooksLabelProvider implements ITableLabelProvider {
public String getColumnText( Object element, int columnIndex ) {
String result = null;
if( columnIndex == 0 ) {
if( element instanceof Book ) {
result = ( ( Book )element ).getTitle();
...

和简洁的 API 一样,使用 SWT 的优势是充足的文档、示例和 Eclipse 社区的支持。大数据的处理、使用 OSGi 对应用分层和基于模型的用户界面集成,这些都是 Tabris 所提供的全部看家本领。

Tabris 的底层架构能和 Java 技术简单地集成。Tabris 的瘦客户端体系结构可以与 Web 服务器和 Web 浏览器的结构相类比。Web 服务器和 Web 浏览器中,Web 应用程序逻辑在服务器端执行,UI 界面部分则以 HTML 呈现并通过浏览器的渲染。对于 Tabris,应用程序逻辑也在服务器上执行,例如 JEE 应用服务器。原生的客户端,比如连接到服务器的平板以 JSON 的方式接收 UI 界面的呈现。但与基于 HTML 的用户界面不同,Tabris 客户端呈现原生的挂件,从而创建一个特定平台的用户体验。

和 Web 应用程序一样,移动客户端总是需要连接到服务器。对于某些应用来说,这是不可接受的限制,但对于其他应用来说这的确是好处。数据只是为了创建界面而传输。客户端并不执行任何应用程序逻辑,他们只是显示 UI。更重要的是,这意味着没有任何敏感的应用程序数据或算法保存在移动终端设备,这保护它们免遭盗窃或其他损失。

另外一个架构和相关开放通讯协议 1 的有趣的优势,是可以简单地增加不同的客户端。例如,除了移动客户端外也有开源 Web 和桌面客户端。例如,一些客户端是基于 Windows CE 或有限的嵌入式设备,如收银机,它们可以简单地减少控件集并允许新的应用和迁移方法。

Tabris 1.0 版于 2013 年 4 月发布。服务端组件包括 Web 和桌面端都受 Eclipse 公共许可协议覆盖并可以自由地用于商业产品。只有移动客户端是属于商业许可协议。要亲自测试和评估 Tabris 提供的广泛的功能,移动客户端可从该项目的网站下载 2。

1 RAP / 协议

2 Tabris

关于作者

Jochen Krause是 Eclipse 基金会的董事局的成员。他是 EclipseSource 的 CEO, Eclipse 分布式和 OSGi 技术公认的领导者。自 Eclipse 社区 2002 年成立以来,Jochen Krause在社区中发挥了领导作用,并曾担任许多角色,从项目领导到理事会和 PMC( Eclipse Project Management Committee,Eclipse 项目管理委员会 )的成员。

Holger Staudacher是一名软件开发人员并且是 EclipseSource 在德国卡尔斯鲁厄的顾问。他是负责 Tabris 项目并且是 Eclipse 的远程应用平台(RAP)项目团队的核心成员之一。Holger Staudacher还编写了测试 REST API 的流行框架 restfuse 。他对任何关于敏捷,代码整洁之道和分布式系统都感兴趣。

查看英文原文: Native Cross-Platform Apps with Tabris


感谢崔康对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2013-08-14 07:583007
用户头像

发布了 81 篇内容, 共 25.7 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

微信业务架构图&学生管理系统架构设计

高山觅流水

架构实战营 「架构实战营」

如何建立高效的质量保障机制

老张

软件测试 质量保障 交付能力

Video.js 使用教程 - 手把手教你基于 Vue 搭建 HTML 5 视频播放器

蒋川

Vue video.js

Echarts 折线图完全配置指南 - 手把手教你设置 Echarts 折线图详细教程

蒋川

Vue eCharts

Petal Maps的美学钥匙,解锁AITO问界M5的硬核浪漫

脑极体

【ELT.ZIP】OpenHarmony啃论文俱乐部——轻翻那些永垂不朽的诗篇

ELT.ZIP

OpenHarmony 数据压缩 ELT.ZIP

架构实战营-第6期 模块一课后作业

乐邦

「架构实战营」

在线HTML压缩工具

入门小站

工具

个全中文注释的迷你Spring!

程序员阿杜

Java spring springboot

车联网数据安全新挑战的技术应对方案

Speedoooo

车联网 物联网 数据安全 容器安全

架构实战营6&微信业务架构&学生管理系统方案

唐诗宋词

赋能创新,深开鸿重磅发布面向金融行业KaihongOS发行版

科技汇

分布式事务详解:分段提交与最终一致性

分布式事务 可靠消息最终一致 TCC 构架 最终一致性

摩尔定律的现在及未来

科技新消息

vivo 商品中台的可视化微前端实践

vivo互联网技术

可视化 前端特效

性能测试中的LongAdder

FunTester

性能测试 FunTester

java高级用法之:在JNA中使用类型映射

程序那些事

Java 程序那些事 3月月更 JNA

在线常用crontab表达式大全验证解析

入门小站

工具

React Router 6 (React路由) 最详细教程

蒋川

React react rout

TDengine 和 InfluxDB 查询性能对比测试报告

TDengine

数据库 tdengine

Linux常用命令分享:有手就会,但能解决95%以上的问题

优麒麟

Linux 开源 计算机 优麒麟

Linux之time命令

入门小站

Linux

[Day2]-[回溯] N皇后问题

方勇(gopher)

LeetCode 动态规划 数据结构算法

【研讨会报名截止最后一天】全程参会,还有惊喜奖品等你拿!

龙智—DevSecOps解决方案

CI/CD 在线研讨会

AppCube快速开发问卷调查应用在WeLink发布上线

DS小龙哥

3月月更

成为 DevOps 工程师需要具备哪些能力?

飞算JavaAI开发助手

DiDi Kafka-Manager安装和简单使用

云原生

kafka spring kafka manager

【躲过裁员,成功上岸】发现小公司有不好的苗头,赶紧学习!

小傅哥

面试 小傅哥 中间件 项目

什么是404页面?

源字节1号

404

解决报错:SSL certificate problem: certificate has expired

liuzhen007

git

CPU的“花招”已耍完?无指令集架构颠覆旧套路

OneFlow

人工智能 机器学习 深度学习 英伟达 芯片

使用Tabris创建原生跨平台应用_Java_Jochen Krause_InfoQ精选文章