通过最大化代码重用来为 Android 和 J2ME 编写应用程序的正确设计方法是啥?

Posted

技术标签:

【中文标题】通过最大化代码重用来为 Android 和 J2ME 编写应用程序的正确设计方法是啥?【英文标题】:What's the right design approach for writing an application for both Android and J2ME by maximizing code-reuse?通过最大化代码重用来为 Android 和 J2ME 编写应用程序的正确设计方法是什么? 【发布时间】:2011-02-09 09:21:14 【问题描述】:

大多数人都在询问从 J2ME 迁移到 android 的问题。我不是。我想开发应用程序并让它们在 Android 和 J2ME 上运行。显然,对于每个应用程序,我将拥有一个 Android 项目和一个 J2ME 项目,并且两者都将在一个共享依赖项目中获取资源,该项目将具有公共代码。

我想知道人们认为正确的设计方法应该是什么 最大化代码重用(最大化共享项目中的代码)。

在我的典型 J2ME 应用程序中,有一个控制器/模型和一堆视图。 所以每个视图都持有对控制器的引用,当用户与视图交互时,视图调用控制器的方法,控制器决定接下来应该显示哪个视图以及它应该包含哪些数据。这些观点彼此不了解。如果编写得当,我希望控制器/模型代码大部分可以重用。

问题是:这 1 个控制器到多个视图如何转换为 Android,其中每个 Activity 执行整个应用程序的一个子集?

一种方法是使用单个活动(其中的控制器代码)。 这意味着应用程序必须处理 Back(就像 J2ME 一样)。 这也意味着当onAddContextMenu 被调用时,它必须知道当前正在显示哪种类型的页面才能添加页面特定的上下文菜单。

另一种方法如下:每个应用程序视图变成一个活动,模型控制器从一个活动传递到另一个活动。

有什么更好的意见吗?其他方法?

【问题讨论】:

【参考方案1】:

我建议使用LWUIT 框架。您可以使用LWUIT 开发基于 Android、Blackberry 和 Midlet 的应用程序,只需稍作改动即可。但是在 android 中,你不能使用 RMS 概念、PIM API 和 JSR 172 以及一些 API。 所以你只需要改变那些东西。 LWUIT 支持触控和非触控手机。

还有一个信息,您可以在 Android 平台上使用纯 Java 功能。因为通常Java ME没有Map、Set、ArrayList、一些字符串功能等。在Android中,您可以使用以上所有功能。无需更改,但可以降低代码的复杂性。

【讨论】:

感谢您的建议。我看着它。 LWUIT 的问题是“MIDP 2.0/CLDC 1.1 支持 LWUIT”。我想要 我的应用程序应该通过使用较短的字符串在原始 J2ME 手机上运行。因此,如果我要为 Android 和 J2ME 重新编写单独的 UI,那么处理 1 个控制器和许多视图的最佳方法是什么? (如我原来的问题中所述)1)单个活动或 2)多个活动相互传递控制器?【参考方案2】:

好的,现在我已经有了一些为两个平台开发应用程序的经验(实际上每个平台有 2 个应用程序),我可以回答我自己的问题。首先,我必须指出 平台之间的差异不仅仅是 UI。有很多不同的做法,例如蓝牙、本地化、通知、存储等。

1) 我使用一个控制器在多个视图之间切换,但我认为,android 的方式更好,换句话说,控制器应该被分解成更小的子控制器,所以它更多地对应于 android 的活动。这可确保仅触发所需的代码,而不是在应用程序处于活动状态时将所有控制器都保存在内存中。 2)我使用源链接而不是项目依赖项。我的每个应用程序都是一个项目,其中包含多个源文件夹(使用链接源)。例如,一个 Android 应用程序指向一个 android 平台 impl 文件夹、一个通用平台文件夹、一个 android bluetooth impl 文件夹、一个通用蓝牙文件夹、一个 Android Storage impl 文件夹、一个通用存储文件夹、一个通用控制器文件夹和一个 android 特定控制器文件夹,以及类似的存储...(J2me 应用程序拉入所有通用文件夹,但拉入 J2me 文件夹而不是 android 文件夹) 每个源文件夹包含几个包... 3)我使用工厂,所以我有 android 工厂,它们实现了创建 android 对象(来自 android 源文件夹)的通用接口和创建 j2me 对象(来自 j2me 源文件夹)的 j2me 工厂,当然所有创建的对象都实现了通用接口(来自通用源文件夹) 4)我学会了如何在每个平台上处理蓝牙、通知、存储等,有趣的部分是将你在每个平台上做事的不同方式抽象为适用于两个平台的通用抽象方式。

这样做的好处(源链接)是: 1)我在同一个工作区中拥有所有项目/应用程序(我现在有一个 j2me 应用程序系列和另一个 android 应用程序)。我可以看到每个项目中的所有通用代码,我可以在处理某个项目时轻松修改它,显然它会立即影响它使用的所有其他项目。 2) 重构也很有效。我可以轻松地将课程从一个源文件夹移动到另一个源文件夹。 3) 这样做的有趣之处在于,通常程序员编写一个基类并将其专门用于子类。但是通过链接不同的源代码,你可以让一些类扩展两个不同的超类。换句话说,我可以让 X 类扩展 Y 类,但在两个不同的项目中,Y 类是不同的。这允许我为同一个泛型类拥有两个不同的平台特定基类...(这一定会让读者感到非常困惑)

因此,即使我的每个项目都链接到公共代码和唯一代码,我的所有源代码都在一个位置,并且每个项目二进制文件都在项目空间中。所以一个通用的 .class 文件可能会在每个使用它们的项目中重复。 那么是什么将所有工作抽象为通用抽象类,而我的控制器处理它们。抽象类通常以对我的抽象/通用控制器透明的平台特定方式实现。

好吧,对不起,这个答案非常抽象,所以让我再举一个具体的例子: 所以现在我有一个叫做蓝牙控制器的东西。它是一个在 J2ME 和 android 中实现的抽象实体。将来,如果我需要在新的 android 项目中使用蓝牙,我只需拉入蓝牙的通用代码和 android 特定代码。如果我想开发一个 midlet,同样适用于 j2me。我的可重用组件由通用和特定于平台的实体组成。

我希望这个答案能为那些试图为 J2ME 和 android(或其他未来的 Java 平台)开发应用程序的人提供一些帮助 如果您有任何问题,可以尝试与我联系...

【讨论】:

以上是关于通过最大化代码重用来为 Android 和 J2ME 编写应用程序的正确设计方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Android基于XMPP Smack Openfire下学习开发IM连接断开重连

Android之代码混淆

Android安全-代码安全3-Dex文件校验

Android 逆向IDA 工具使用 ( 重命名函数 | 添加注释 | 添加标签 / 跳转标签 | 代码跳转前进 / 后退 )

Android 逆向IDA 工具使用 ( 重命名函数 | 添加注释 | 添加标签 / 跳转标签 | 代码跳转前进 / 后退 )

Android 通过验证用户名和密码使用重定向 url 在 Web 视图中查看 .pdf 文件