我是JaveEE开发人员。最近我加入了一个Android开发团队。 Android的结构让我很困惑。 MVC设计模式似乎不适合Android开发。那么Android开发的设计模式原理是什么?我的意思是有任何关于如何编写干净,易读和有效的Android代码的提示。
答案 0 :(得分:53)
Android的架构一开始让我恼火,但我开始看到一种疯狂的方法。 Android文档很难解释它。我最大的抱怨一直是,很难拥有一个集中数据模型,其中包含您的活动共享的对象,就像普通的应用程序一样。 Android似乎希望我成为一名游牧民族,因为我只能在我的活动之间分享原语。并且在数据库中丢弃垃圾不是模型,因为它不包含任何行为。因此,大多数人的业务逻辑都会在我的活动中结束,这使得很难在其他活动中分享业务逻辑。
我来发现我错过了一些关键的拼图。 Android是MVC。但是,它与View相当重要。
有趣的是,您可以创建Application的子类并在Manifest文件中声明它,并且Android将创建此对象的单个实例,无论Activity被销毁或创建什么,它都会占用应用程序的长度。这意味着您可以在那里构建一个所有活动都可以访问的集中数据模型。
我看到这种方式就像一个原始的Spring容器,你可以初始化对象并解决它们之间的依赖关系。这样,您可以将应用程序的模型部分与活动本身分开。只需让Activity对模型进行调用,然后手动回调即可接收结果,以便更新UI。
Android的问题在于它混合了控制器和视图。例如,像TabActivity,ListActivity这样的子类意味着使用了某个视图。因此,交换视图非常复杂。即使您使用Activity,Controller也会对视图的内容做出非常具体的假设。他包含对TextView等UI对象的直接引用。它注册了低级事件,如点击,键盘等。
如果活动可以注册更多高级别的活动,例如“登录”,“更新帐户余额”等,视图将根据一系列点击,键盘,触摸事件进行调度,这样会更好。这样,控制器就可以在您描述功能而不是设计功能的级别上工作。
我认为我们最终会达到这种类型的设计,因为我们更好地了解了更好的工具和技术。似乎Android可能具有实现这一目标的可扩展性,但是由社区来制定它。
答案 1 :(得分:18)
Android中的操作,视图和活动是使用Android UI的方式,是模型 - 视图 - 视图模型模式的实现,它在结构上与模型视图控制器类似(在同一系列中)。
据我所知,没有办法打破这种模式。它可能已经完成,但您可能会失去现有模型的所有好处,并且必须重写您自己的UI层才能使其工作。
您可以在以下网址找到MVC:
没有单一的MVC模式你可以遵守。 MVC或多或少表明你不应该混合数据和查看,所以例如视图负责保存处理数据直接影响视图的数据或类。
但是,Android处理类和资源的方式,有时甚至被迫遵循MVC模式。在我看来,更复杂的是活动,它们有时对视图负责,但在同一时间充当控制者。
如果您在xml文件中定义视图和布局,请从res文件夹加载资源,如果您避免或多或少地在代码中混合这些内容,那么您无论如何都要遵循MVC模式。
答案 2 :(得分:0)
Android开发主要是GUI开发,与Java中的Swing / AWT一样,它包含许多对GUI事件作出反应的匿名内部类。它的其中一件事让我远远不能用Swing做很多事情......但是我有一部安卓手机,所以我会咬紧牙关然后克服它,正如许多Apple粉丝所说的那样关于天线问题。 ;)
答案 3 :(得分:0)
Android做出了使Controller和View成为单个类的典型决策。这鼓励在同一个地方放太多。一个活动对应一个屏幕,每个视图对应一个屏幕区域(有时是整个屏幕),每个控制器对用户从屏幕区域做出手势,而模型只是模型,有时由环境或其他一些服务支持疯狂的一套实用功能。我使用Activity来协调一个或多个MVC三重奏。这有助于处理Android的选择,只需将所有内容放在同一个地方。
我可以在不运行模拟器的情况下测试绝大多数Android应用。大赢。
答案 4 :(得分:0)
抱歉我的英文。
Android具有非常好的模块化(活动,片段,视图,服务等)。所以MVC没有必要。
当然,将输入(活动,片段),逻辑,视图(xml或java)和数据(数据库,文件,首选项)分开。但这不是MVC。你不应该尝试使用MVC,它只会使你的架构复杂化。
Android不会将某些东西保留在全局范围内,而是激励您在其范围(类成员,局部变量)中尽可能深地保留对象,并使用Intents / Bundles将对象传递给活动或从活动传递到片段。这也是因为内存限制。
如果是前台活动,系统可能会破坏您的活动 需要更多资源,因此系统必须关闭后台 恢复记忆的过程。
因此将非常量(可变)对象存储为全局(静态)对象是不安全的。通常使用static
表示不可变常量。
简单来说,您将应用程序分成屏幕(活动)。然后每个屏幕 - 分成片段(Fragments)。要在屏幕上执行一系列操作,您还可以使用片段(example)将它们分开。
因此,您的应用程序中存在非常小的块,每个块都可以轻松地进行测试和重用。
答案 5 :(得分:-2)
我的印象是android编程模型与MS WPF有很多相似之处。 XML布局定义,始终绑定到其中一个定义的代码...... 因此,如果您要询问设计模式,因为您想要改进当前或开发的Android项目,也许您应该查看WPF实践和模式以改进体系结构,如MVVM。
查看以下链接:
http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
有一个小项目已经在尝试类似的事情:
http://code.google.com/p/android-binding/
欢呼声