Activity类在MVC中的作用是什么?

时间:2012-02-15 10:51:52

标签: android design-patterns

我知道有很多关于此的问题,但是,我仍然在努力理解Activity类在Android上实现传统的模型 - 视图 - 控制器设计模式时应该扮演什么角色?

我的直觉是它应该是Controller,但是这意味着UI屏幕之间的一对一关系(因为你每个屏幕必须有一个Activity)和控制器,这会破坏MVC的要点不同组件之间松耦合。

4 个答案:

答案 0 :(得分:8)

你是对的。 xml接口可以定义为 View ,而您的其他类可以使用模型来处理数据。

活动从View接收所有事件和用户输入,因此,我们可以轻松地说它是控制器

但是,让我们清楚,它不是一个完美的(它真的存在吗?)MVC

查看this question,更具体地说,看看接受答案的第一条评论,它可能有用

答案 1 :(得分:1)

活动可以成为有能力的控制器,并且通过片段,您还可以实现分层MVC。制作MVC的大部分工作取决于程序员,因为即使在最严格的框架中,您仍然可以找到do crazy things的方法。

答案 2 :(得分:0)

Android没有良好的架构,也没有遵循MVC设计模式。

在MVC中概念化Activity的最佳方式是作为一个View(带有一些控制器逻辑),因为每次发生配置更改时它都会被销毁,例如屏幕旋转或区域设置更改,丢失所有状态。

在这种情况下,控制器将是Application对象,因为它是从Activity上下文之外的代码访问视图(Activity及其GUI组件)的桥梁。您必须使用单例,以便在给定时间只有一个Application对象,否则每个进程将有一个Application对象。 Application对象不是存储Model的好地方,因为它的生命周期与Activities的生命周期分离。它可以在Activity的生命周期的任何一点被破坏和重新创建(当应用程序在后台时)而不会导致它重新启动,然后它的onCreate()方法中未分配的所有变量和引用将变为空。

因此,模型必须存储在一个无GUI的无头片段中,该片段具有setRetainInstance(true),该片段链接到一个活动,并且每次重新创建活动时都必须重新附加到它。您必须使用片段管理器来确保您正在恢复保留的片段而不是重新创建它。这也是运行后台任务的最佳位置,但您也可以在Application对象中运行它们。永远不要在Activity上运行任务,因为它们会在配置更改时被销毁。

答案 3 :(得分:0)

我认为将视图定义为XML会产生混淆,因此Activity被误认为是视图。不是。您将视图(您的XML布局)传递给Activity,然后将扩展XML布局中包含的视图。您的活动还会将数据(模型)传递到您的视图中(EditText,TextView,基本视图的扩展版本等)。

如果你真的想要MVC,那么只需在XML布局中设置视图就可以实现这一点,创建一个从根视图扩展的视图对象(如果它是从那个扩展的RelativeLayout)。从那里你可以添加你的访问器方法和该视图所需的不同逻辑,然后你可以在那里添加单元测试。

在活动中,您将不再传递布局的ID,而是执行以下操作:

CustomView customView = new CustomView(...);
setContentView(customView);
...

当然,几乎所有的应用程序都不会这样做,你真的不需要这样做。调用findViewById足以链接到该视图对象并调用它拥有的方法。在我看来,是MVC。