我正在为Android开发一个应用程序,我认为它的功能在其他(Java运行)平台上可能很有用(比如一个普通的桌面应用程序 - 虽然我希望其他平台能够参与其中)对于手头的问题并不重要。)
UI不太可能以任何方式移植(在具有良好触控功能,4英寸屏幕UI和鼠标和键盘19英寸屏幕UI之间存在太大差异),所以我很高兴足够重新实现这一点。
然而,理论上,核心“业务逻辑”(ugh,horrid word)和模型(数据存储)类可以在管理核心应用程序时重用。我注意到我写的很多类都没有最终引用一些特定于Android的位(我有XML资源文件,图像和SQLite数据库,例如)。基本上我到目前为止所写的一切至少有一个与Android相关的导入。
我的问题有两个:
只要提供了一些理由,“hahahaha,你注定失败”的答案都可以。
(P.S。我会制作这个社区wiki,如果它仍然可用;这对我来说似乎是一个完美的CW问题 - Android可移植性提示和工具列表)
答案 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
)答案 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,我相信它们也适用于其他平台
答案 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类,因此一些示例可能有所帮助: