在 Android 和“其他平台”之间制作可移植应用程序的推荐方法
Posted
技术标签:
【中文标题】在 Android 和“其他平台”之间制作可移植应用程序的推荐方法【英文标题】:Recommended ways to produce app portable between Android and "other platforms" 【发布时间】:2011-02-12 08:33:54 【问题描述】:我正在为 android 开发一个应用程序,并且我认为它的功能可能在其他(运行 Java 的)平台(比如一个常规桌面应用程序)上很有用——尽管我希望涉及的其他平台对手头的问题无关紧要)。
用户界面不太可能以任何方式便携(良好的触控功能、4 英寸屏幕用户界面和鼠标和键盘的 19 英寸屏幕用户界面之间存在太大差异),所以我很高兴足够单独重新实现。
但是,理论上,核心“业务逻辑”(呃,可怕的词)和模型(数据存储)类可以重用于管理核心应用程序。我注意到我编写的很多类最终都不会引用一些特定于 Android 的位(例如,我有 XML 资源文件、图像和 SQLite 数据库)。到目前为止,我写的所有内容基本上都至少有一个与 Android 相关的导入。
我的问题有两个:
有哪些工具可以帮助我在非 Android 平台上使用与 Android 相关的类和功能(例如资源、数据库);和 由于不可移植性,我应该完全避免使用 Android 平台的哪些类、功能等(为简单起见,我们排除与 UI 相关的项),以及我应该改用什么来提高可移植性。李>只要提供一些理由,由“哈哈哈,你注定要失败”组成的答案是可以的。
(P.S. 如果它仍然可用,我会创建这个社区 wiki;这对我来说似乎是一个完美的 CW 问题——Android 可移植性提示和工具列表)
【问题讨论】:
是否有任何具有通用业务层的开源跨平台项目? 【参考方案1】:看起来您已经通过将 UI 和业务逻辑/模型分开来确定关键点。 sqlite 本身也不仅用于 Android。当然,你与它交互的方式(例如 SQLDBOpenHelper)又是不同的。
所以我想将商业逻辑和模型尽可能分开是可行的方法。 然后,您可以在其周围放置一个包装器(例如,与特定数据库对话的“数据访问对象”模式)。
请记住,当您在 UI 方面尽可能地针对某个平台时,用户体验是最好的。 示例:Android 市场上有一个应用程序(Push & Ride),它似乎在 J2ME 模拟器中运行。所以屏幕输入并没有使用设备的普通软(或硬)键盘,而是数字键上带有“abc”“def”组合的模拟手机键盘,这使得数据输入有点奇怪。 这个应用程序肯定非常便携(而且它的功能真的很棒),但它就是感觉不对。
当你想去多平台时,你可能还会看看 Appcelerator 或 Adobe AIR 之类的东西
【讨论】:
【参考方案2】:我开始做类似的事情 - 我想为 Android、Blackberry 和 J2ME 编写一个应用程序。从概念上讲,您可以对设计进行分层,使特定于平台的组件(UI、网络访问、数据存储)与核心业务逻辑分离。
在实践中,我觉得这并不令人满意。我遇到的所有问题都与 Java 的核心版本在不同的平台上不同(在 Blackberry 中它基于 J2Se 1.4,而 Android 使用 Java 6 作为基础)。这导致了诸如
之类的烦恼 无法重用使用泛型的代码 我的首选课程没有统一可用(例如,强制使用Vector
而不是List
)
我已在 SO(here 和 here)上就此展开讨论,但无法得出结论。
【讨论】:
【参考方案3】:日志层可以通过使用Simple Logging Facade for Java(SLF4J) 进行移植,该Simple Logging Facade for Java(SLF4J) 可用于java/log4j 和android。
【讨论】:
【参考方案4】:你也可以试试这个
http://wp7mapping.interoperabilitybridges.com/Home/Library?source=Android
包含将您的 android 应用映射到 Windows 手机的文档和工具
也请阅读此内容,尽管它包含特定于 android - windows phone interop 的说明,但我确信它们也适用于其他平台
http://windowsphone.interoperabilitybridges.com/media/49652/wp7_guide_for_android_application_developers.pdf
【讨论】:
【参考方案5】:我所做的是在 android 应用程序之外创建一个 Web 服务,该服务可由 android 应用程序以及其他系统(网站、Windows 应用程序、iPhone 应用程序等)使用。
支持 JSON 的简单 REST Web 服务是获取数据和插入/更新数据的一个很好的示例。 JSON 特别适合,因为它非常轻量级,并且不需要大量带宽,非常适合慢速移动连接。
通过这种方式,您可以将模型/数据存储在 android 应用程序之外,并且可以很容易地被其他应用程序使用。
【讨论】:
【参考方案6】:使用android jdbc 或database abstraction layer/object relational mapper/ActiveRecord implementation 可以使数据库层更便携。
有没有人试过让 android.database(.sqlite) 在非安卓系统上运行?
【讨论】:
【参考方案7】:如果您仔细地将业务逻辑与 UI 和 android perks 分开,您将能够在桌面环境中重用它。 Android 在初始化和应用程序生命周期方面与它有很大不同 - 抽象创建和设置 BL 也是必要的。
用于此目的的有用模式是依赖注入。周围有不同的框架,有些更适合 android(如 roboguice)或桌面(spring 或 picocontainer 或 guice)。
Android 应用程序的内存非常有限,这限制了您可以在那里使用的框架。所以你可能还需要抽象数据存储(休眠在桌面/服务器端很方便,但对于移动设备来说太重了)
【讨论】:
【参考方案8】:我倾向于建议试用 Adobe Air 的新原生扩展。它允许您创建特定于设备的本机代码块,并将其连接到 Air 框架,像访问 Air 中的其他对象一样访问它。 (参见http://www.adobe.com/devnet/air/articles/extending-air.html)。这允许您保持 Android 专用代码原样,然后根据需要用 ios、Windows DLL 等代码替换该代码。
当然,这并不能解决将 Java 代码翻译成其他语言/平台的问题。尽管如此,您在本地执行的一些逻辑很可能已经在 Air 中跨平台存在。例如,您可以在所有受支持的操作系统中访问 Air 中的相机,而无需编写任何特定于设备的代码。
您可能需要超越当前的 Air 课程,因此一些示例可能会有所帮助:
Android speech-recognition iOS batttery Windows and Mac tutorial NE tutorial【讨论】:
以上是关于在 Android 和“其他平台”之间制作可移植应用程序的推荐方法的主要内容,如果未能解决你的问题,请参考以下文章
malloc 和 HeapAlloc 之间是不是存在根本区别(除了可移植性)? [复制]
确保某些属性(例如 android:attr/textAppearanceMedium)在不同版本的 Android 上工作的可移植方式是啥