在Android和“其他平台”之间制作app便携式的推荐方法

时间:2011-02-12 08:33:55

标签: java android portability

我正在为Android开发一个应用程序,我认为它的功能在其他(Java运行)平台上可能很有用(比如一个普通的桌面应用程序 - 虽然我希望其他平台能够参与其中)对于手头的问题并不重要。)

UI不太可能以任何方式移植(在具有良好触控功能,4英寸屏幕UI和鼠标和键盘19英寸屏幕UI之间存在太大差异),所以我很高兴足够重新实现这一点。

然而,理论上,核心“业务逻辑”(ugh,horrid word)和模型(数据存储)类可以在管理核心应用程序时重用。我注意到我写的很多类都没有最终引用一些特定于Android的位(我有XML资源文件,图像和SQLite数据库,例如)。基本上我到目前为止所写的一切至少有一个与Android相关的导入。

我的问题有两个:

  • 有哪些工具可以帮助我在非Android平台上使用与Android相关的类和功能(例如资源,数据库);和
  • 由于不可移植性,我应该完全避免使用Android平台的哪些类,功能等(为了简单起见,让我们排除与UI相关的项目),以及我应该使用什么来改善可移植性。

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

(P.S。我会制作这个社区wiki,如果它仍然可用;这对我来说似乎是一个完美的CW问题 - Android可移植性提示和工具列表)

8 个答案:

答案 0 :(得分:3)

看起来您已经通过保持UI和业务逻辑/模型分离来确定关键点。 此外,sqlite本身不仅用于Android。但是当然你与它交互的方式(例如SQLDBOpenHelper)又是不同的。

所以我想将商业逻辑和模型尽可能分开是要走的路。 然后,您可以在其周围放置一个包装器(例如,与特定数据库通信的“数据访问对象”模式)。

请记住,当您在UI端尽可能特定于平台时,用户体验最佳。 示例:Android市场上有一个App(Push& Ride),它似乎在J2ME模拟器中运行。因此屏幕输入不使用设备的普通软(或硬)键盘,而是数字键上带有“abc”“def”组合的模拟电话键盘,这使得数据输入有点奇怪。 这个应用程序肯定非常便携(它的功能真的很棒),但它感觉不对。

当你想要进入多平台时,你可能也会看到像Appcelerator或Adobe AIR这样的东西

答案 1 :(得分:3)

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

在实践中,我觉得这并不令人满意。我面临的问题都与Java的核心版本在不同平台上有所不同(在Blackberry中它基于J2Se 1.4,而Android使用Java 6作为基础)。这导致了像

这样的烦恼
  • 无法重复使用泛型的代码
  • 我的首选课程无法统一提供(例如,强制使用Vector而不是List

我已在SO(herehere)上就此进行了讨论,但未能得出结论。

答案 2 :(得分:2)

使用适用于java / log4j和Simple Logging Facade for Java(SLF4J)android可以使日志记录层可移植。

答案 3 :(得分:2)

另外,你可以尝试一下

http://wp7mapping.interoperabilitybridges.com/Home/Library?source=Android

包含将您的Android应用程序映射到Windows Phone的文档和工具

同时阅读本文,即使它包含特定于android的说明 - windows phone interop,我相信它们也适用于其他平台

http://windowsphone.interoperabilitybridges.com/media/49652/wp7_guide_for_android_application_developers.pdf

答案 4 :(得分:1)

我所做的是在Android应用程序之外创建一个Web服务,可以被Android应用程序以及其他系统(网站,Windows应用程序,iPhone应用程序等)使用。

支持JSON的简单REST Web服务是获取数据并插入/更新数据的一个很好的示例。 JSON特别适合,因为它非常轻巧,并且不需要很多带宽,这对于慢速移动连接非常有用。

通过这种方式,您可以将模型/数据存储存储在Android应用程序之外,并且可以非常轻松地被其他应用程序使用。

答案 5 :(得分:0)

使用android jdbc或使用database abstraction layer/object relational mapper/ActiveRecord implementation可以使数据库层更具可移植性。

有没有人试过让android.database(.sqlite)在非android系统上运行?

答案 6 :(得分:0)

如果您仔细分离业务逻辑与UI和Android特权,您将能够在桌面环境中重用它。 Android在初始化和应用程序生命周期方面与它完全不同 - 抽象BL的创建和设置也是必要的。

用于此目的的有用模式将是依赖注入。有不同的框架,有些更适合Android(如roboguice)或桌面(spring或picocontainer或guice)。

Android应用程序在内存中受到很大限制,这限制了您可以在那里使用的框架。所以你可能也需要抽象数据存储(hibernate在桌面/服务器端很方便,但对移动设备来说太重了)

答案 7 :(得分:0)

我倾向于建议尝试Adobe Air的新原生扩展。它允许您创建特定于设备的本机代码块,并将其连接到Air框架,像在Air中的其他对象一样访问它。 (参见http://www.adobe.com/devnet/air/articles/extending-air.html)。这允许您按原样保留仅Android代码,然后根据需要将代码替换为iOS,Windows DLL等代码。

当然,这并不能解决将Java代码转换为其他语言/平台的问题。尽管如此,您在本地进行的一些逻辑可能已经很好地存在于Air中。例如,您可以在所有支持的操作系统中访问Air中的摄像头,而无需编写任何特定于设备的代码。

您可能需要超越当前的Air类,因此一些示例可能有所帮助: