推荐的方法来制作可在Android和其他平台间传输的应用程序

15

我正在开发一个 Android 应用程序,我认为它的功能可能在其他(运行 Java 的)平台上也有用(比如普通的桌面应用程序——尽管我希望涉及的其他平台对问题不重要)。

UI 不太可能以任何方式可移植(好的触摸屏幕 UI 和鼠标键盘 19 英寸屏幕 UI 之间差别太大了),所以我愿意单独重新实现 UI 部分。

然而,“业务逻辑”(呃,可怕的词)和模型(数据存储)类可以在管理核心应用程序时,在理论上被重复使用。我发现我写的类中很少有不引用一些 Android 特定部分的(例如 XML 资源文件、图像和 SQLite 数据库)。基本上我到目前为止写的所有内容都至少有一个与 Android 相关的导入。

我的问题有两个方面:

  • 有哪些工具可用来帮助我在非 Android 平台上使用 Android 相关类和特性(例如资源、数据库);以及
  • 由于不可移植性,应该完全避免使用 Android 平台的哪些类、特性等(出于简单起见,我们排除 UI 相关项),并且应该使用什么来提高可移植性。

只要提供一些理由,回答“哈哈哈,你注定要失败”的都可以。

(附言:如果社区维基仍然可用,我会将这个问题变成社区维基的。对于我来说,这似乎是一个完美的社区维基问题—— Android 可移植性技巧和工具列表)


有没有任何开源跨平台项目,它们具有共同的业务层? - k3b
9个回答

3
看起来您已经通过将UI和业务逻辑/模型分开来确定了关键点。 Sqlite本身不仅在Android中使用。但是,与它的交互方式(例如SQLDBOpenHelper)当然又不同了。
因此,我想尽可能地将业务逻辑和模型分开是正确的方法。然后,您可以在其周围放置一个包装器(例如“数据访问对象”模式),该包装器将与特定DB进行通信。
仍然要记住,在UI方面,最好尽可能地针对特定平台提供用户体验。 例如:在Android市场上有一个名为“Push&Ride”的应用程序,似乎在J2ME模拟器中运行。因此,屏幕输入不使用设备的常规软(或硬)键盘,而是使用带有数字键上的“abc”“def”组合的模拟电话键盘,这使得数据输入有些奇怪。 这个应用程序肯定非常便携(其功能真的很棒),但感觉并不正确。
当您想要跨平台时,您也可以看看像Appcelerator或Adobe AIR之类的东西。

3

我最初做了类似的事情 - 我想为Android、Blackberry和J2ME编写一个应用程序。从概念上讲,您可以分层设计,使平台特定组件(用户界面、网络访问、数据存储)与核心业务逻辑分离。

实际上,我并不认为这是令人满意的。我遇到的问题都与不同平台中Java的核心版本不同有关(在Blackberry上基于J2Se 1.4,而Android使用Java 6作为基础)。这导致了烦恼,例如:

  • 无法重用使用泛型的代码
  • 我的首选类在不同平台上不可用(例如,被迫使用Vector而不是List

我在Stack Overflow上开展了关于此问题的讨论(herehere),但未能得出结论。


2

2

1
我所做的是在安卓应用程序之外创建一个网络服务,可以被安卓应用程序以及其他系统(网站、Windows 应用程序、iPhone 应用程序等)使用。
一个简单的支持 JSON 的 REST 网络服务是获取数据以及插入/更新数据的好例子。JSON 特别适合因为它非常轻量级,不需要大量带宽,这对于慢速移动连接非常有利。
这样一来,您可以将您的模型/数据存储放在安卓应用程序之外,并且可以很容易地被其他应用程序使用。

0

0

0
如果您仔细将业务逻辑与UI和Android特权分开,您将能够在桌面环境中重复使用它。 Android在初始化和应用程序生命周期方面与其相当不同-抽象出BL的创建和设置也是必要的。
为此有用的模式是依赖注入。周围有不同的框架,其中一些更适合Android(如roboguice)或桌面(spring或picocontainer或guice)。
Android应用程序在内存方面非常受限,这限制了您可以在那里使用哪些框架。因此,您可能还需要抽象数据存储(Hibernate在桌面/服务器端很方便,但对于移动设备来说太重了)。

0
我倾向于建议尝试使用Adobe Air的新本地扩展。它允许您创建一个特定于设备的本地代码块,并将其连接到Air框架,像访问Air中的其他对象一样进行访问。(参见http://www.adobe.com/devnet/air/articles/extending-air.html)。这使您可以保留Android专用代码,然后根据需要替换为iOS、Windows DLL等代码。
当然,这并不能解决将Java代码转换为其他语言/平台的问题。不过,您在本地执行的某些逻辑很可能已经存在于Air中的跨平台逻辑中。例如,在所有支持的操作系统中,您都可以在Air中访问相机,而无需编写任何特定于设备的代码。
您可能需要超越当前的Air类,因此一些示例可能会有所帮助:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接