用于将动态创建的UIViewController行为调整为Android的模式?

时间:2017-04-28 19:54:55

标签: android architecture viewcontroller abstraction

前言

我们可能是白痴试图解决这个问题。我们的核心竞争力是iOS而不是Android。说实话,我们希望我们错过了一些关于Android架构的大联盟基本知识。

问题

我们有一个iOS应用程序架构,可以根据各种数据和逻辑动态组装和呈现UIViewControllers。一组DisplayManagers(我们的术语)评估各种数据,以动态创建,配置和呈现应用程序的UIViewControllers。

我们完全不知道如何使这种模式适应Android。

核心问题:

  1. 活动是UIViewController的粗略等价物。遗憾的是,UIViewControllers可以组合,连续显示(在一个视图中多个),并且无需显示即可创建。活动不能。
  2. 当你启动一个Activity时,我们无法(尽我们所知)保持对它的引用并更新它/由它更新。我们知道您可以在intent中传递初始值...但是如果需要根据Singleton中的事件更新特定的Activity,该怎么办?是的,您可以使用LocalBroadcastManager执行此操作 - 我们只是不确定在整个应用程序中发送一千个广播是正确的模式。
  3. 如果不在导航层次结构中,则活动不能存在 - 所以如果您不希望它可用,您必须做一些奇怪的事情,例如重写onBackPressed()并确保它不可触摸等等。
  4. 使用案例

    到目前为止,这不是我们面临这个问题的唯一用例,但展示我们的挑战是一个很好的用例。

    我们根据各种逻辑和数据动态显示,隐藏和链接用户提示。该数据可以通过多种方式进行更改,包括实时数据库更改(通过Firebase)。在iOS上,我们有一个PromptManager单例,可以监听相应的Firebase数据,并且在它收听的数据发生变化时,会评估是否应该显示提示。

    在iOS上,PromptManagerPromptVC协同工作,以管理可能的提示链。 PromptManager创建并管理UINavigationController以显示一系列提示。 PromptVC只知道它应该显示的当前提示。在用户交互时,它会通知响应的PromptManagerPromptManager决定是否再向另一个PromptVC提示另一个提示,或者解除整个UINavigationController(已经持有所有提示)。

    “那么问题是什么?只需将PromptManagerPromptVC合并为PromptActivity。”

    啊,如果我们可以......如果Firebase中的值更改应该触发提示会怎么样? PromptActivity必须始终存在并准备好听取这些变化 - 根据上述“核心问题”,这是有问题的。此外,如上所述,这些提示是许多需要根据Firebase数据事件进行更改的实例之一,因此我们最终会有几十个(或更多)活动因为他们正在收听Firebase而永远不会关闭引用。

    理想世界

    Singleton“DisplayManagers”负责监听数据,然后创建/更新/管理/解雇活动。它们与不同的活动交互以显示/隐藏自己并更新当前活动中的数据。但要做到这一点,我们需要能够继续引用我们从这些单身人士创建的活动。

    对于世界上所有善良的人来说,有没有人知道Android上是否可以使用这样的模式?因为它在iOS上很华丽......

1 个答案:

答案 0 :(得分:1)

我肯定会为此使用一个Activity,并使用多个Fragments。

可以首先显示或不显示片段,因此您可以完全控制片段的生命周期。

您可以在1个活动中拥有多个碎片。

片段可以根据呈现给他们的数据创建所需的布局。

您永远不应该依赖当前未显示的活动。如果Android需要释放内存,那么这些活动可以在任何时候被杀死(尽管极少见,主要是在低端手机上)。

要收听Firebase事件,您应该有一个处理它的服务。 该服务不直接与任何活动/片段绑定,并且独立存在。

然后,无论何时显示片段,它都会向服务添加一个侦听器。然后,该服务可以使用该侦听器通知片段任何传入的更改,并且片段可以相应地执行操作。

您应该查看RxAndroid库。它的构建基于来自各种来源的传入事件来调整UI,并保持所有数据的同步。

如果您有疑问,请随意提出任何问题,但在Android上这种设置肯定是可行的。

编辑: 对评论的回复(更容易在此处写长信息而不是在评论中):
服务将绑定到每个活动(称为"绑定服务"),并且活动将保留对活动中所有碎片的引用。所以服务可以调用Activity,Activity会相应地行动(删除/添加片段,解散自己等) 这也可能是另一种方式,Activity使用一些数据调用服务,而Service可以做某事(比如调用后端API或类似的东西)。

服务的好处是他们从Context继承。这意味着您可以直接从您的服务开始新的活动。

PS:"希望将我们的iOS实现直接迁移到Android",谢谢你的傻笑:)