使动态创建的 UIViewController 行为适应 Android 的模式?
Pattern for adapting dynamically created UIViewController behavior to Android?
前言
我们可能是白痴,因为我们试图做到这一点。我们的核心竞争力是 iOS 而不是 Android。老实说,我们希望我们遗漏了一些关于 Android 体系结构的大联盟基本知识。
问题
我们有一个 iOS 应用架构,可以根据各种数据和逻辑动态组装和呈现 UIViewController。一组 DisplayManagers(我们的术语)评估各种数据以动态创建、配置和呈现应用程序的 UIViewControllers。
我们完全不知道如何使这种模式适应 Android。
核心问题:
- Activity 大致相当于 UIViewController。不幸的是,UIViewControllers 可以组合、连续显示(多个在一个视图中),并且可以在不显示的情况下创建。活动不能。
- 当你启动一个 Activity 时,没有办法(据我们所知)保持对它的引用并更新由它更新的 it/be。我们知道您可以在 Intent 中传递初始值……但是如果特定 Activity 需要根据 Singleton 中的事件进行更新怎么办?是的,您可以使用 LocalBroadcastManager 执行此操作 - 我们只是不确定在我们的应用程序中发送一千个广播是正确的模式。
- 如果不在导航层次结构中,Activity 就不可能存在 - 所以如果您不希望它可用,您必须做一些奇怪的事情,例如覆盖
onBackPressed()
并确保它不可触摸,等等
用例
到目前为止,这不是我们面临此问题的唯一用例,但它是展示我们面临的挑战的好用例。
我们根据各种逻辑和数据动态显示、隐藏和链接用户提示。该数据可以通过多种方式更改,包括实时数据库更改(通过 Firebase)。在 iOS 上,我们有一个 PromptManager
单例,它监听适当的 Firebase 数据,并且在监听的数据发生变化时评估是否应显示提示。
在 iOS 上,PromptManager
与 PromptVC
协同工作以管理可能的提示链。 PromptManager
创建并管理一个 UINavigationController 以显示一系列提示。 PromptVC
只知道它应该显示的当前提示。在用户交互时,它会通知 PromptManager
响应,然后 PromptManager
决定是否用另一个提示呈现另一个 PromptVC
或关闭整个 UINavigationController(一直持有所有提示)。
"So what's the problem? Just combine the PromptManager
and the PromptVC
into a PromptActivity
."
啊,如果我们可以...如果 Firebase 中的值更改触发提示会怎样? PromptActivity
必须始终存在并准备好听到这些更改 - 根据上面的 "Core issues" 这是有问题的。此外,如前所述,这些提示是许多需要根据 Firebase 数据事件进行更改的实例之一,因此我们最终会得到数十个(或更多)永远不会关闭的活动,因为它们正在收听 Firebase参考。
理想世界
Singleton"DisplayManagers"负责监听数据然后creating/updating/managing/dismissingActivities。他们与 show/hide 自身的不同 Activity 交互,并在当前 Activity 内更新数据。但要做到这一点,我们需要能够保留对我们从这些单例创建的活动的引用。
看在世上所有美好事物的份上,有谁知道 Android 上是否可能出现这样的模式?因为它在 iOS...
上很漂亮
我肯定会为此使用一个 Activity,并使用多个片段。
片段可以在先显示或不先显示的情况下创建和销毁,因此您可以完全控制它们的生命周期。
1 个 Fragment 中可以有多个Activity。
Fragment 可以根据呈现给它们的数据创建所需的布局。
您永远不应依赖当前未显示的 Activity。如果需要释放内存,Android 可以随时终止这些活动(尽管这种情况极为罕见,主要是在低端手机上)。
要侦听 Firebase 事件,您应该有一个服务来处理它。
该服务不直接绑定到任何 Activity/Fragment,而是独立存在。
然后每当您显示一个片段时,它都会向该服务添加一个侦听器。然后服务可以使用该侦听器通知片段任何传入的更改,片段可以相应地采取行动。
你应该看看 RxAndroid 库。它实际上是为了根据来自各种来源的传入事件来调整 UI,并保持所有数据同步。
如有任何疑问,请随时提出,但这种设置在 Android.
上是绝对可行的
编辑:
回复评论(在这里写长消息比在评论中更容易):
该服务将绑定到每个 Activity(称为 "Bound Services"),并且 Activity 将保存对 Activity 中所有片段的引用。因此,该服务可以调用 Activity,而 Activity 会相应地采取行动(remove/add 碎片、自行解散等)。
这也可能是另一种方式,即 Activity 使用一些数据调用服务,并且服务可以做一些事情(比如调用后端 API 或类似的)。
Services 的好处是它们继承自 Context。这意味着您可以直接从您的服务开始新的活动。
PS:"were hoping to migrate our iOS implementations fairly directly to Android",谢谢你的笑声:)
前言
我们可能是白痴,因为我们试图做到这一点。我们的核心竞争力是 iOS 而不是 Android。老实说,我们希望我们遗漏了一些关于 Android 体系结构的大联盟基本知识。
问题
我们有一个 iOS 应用架构,可以根据各种数据和逻辑动态组装和呈现 UIViewController。一组 DisplayManagers(我们的术语)评估各种数据以动态创建、配置和呈现应用程序的 UIViewControllers。
我们完全不知道如何使这种模式适应 Android。
核心问题:
- Activity 大致相当于 UIViewController。不幸的是,UIViewControllers 可以组合、连续显示(多个在一个视图中),并且可以在不显示的情况下创建。活动不能。
- 当你启动一个 Activity 时,没有办法(据我们所知)保持对它的引用并更新由它更新的 it/be。我们知道您可以在 Intent 中传递初始值……但是如果特定 Activity 需要根据 Singleton 中的事件进行更新怎么办?是的,您可以使用 LocalBroadcastManager 执行此操作 - 我们只是不确定在我们的应用程序中发送一千个广播是正确的模式。
- 如果不在导航层次结构中,Activity 就不可能存在 - 所以如果您不希望它可用,您必须做一些奇怪的事情,例如覆盖
onBackPressed()
并确保它不可触摸,等等
用例
到目前为止,这不是我们面临此问题的唯一用例,但它是展示我们面临的挑战的好用例。
我们根据各种逻辑和数据动态显示、隐藏和链接用户提示。该数据可以通过多种方式更改,包括实时数据库更改(通过 Firebase)。在 iOS 上,我们有一个 PromptManager
单例,它监听适当的 Firebase 数据,并且在监听的数据发生变化时评估是否应显示提示。
在 iOS 上,PromptManager
与 PromptVC
协同工作以管理可能的提示链。 PromptManager
创建并管理一个 UINavigationController 以显示一系列提示。 PromptVC
只知道它应该显示的当前提示。在用户交互时,它会通知 PromptManager
响应,然后 PromptManager
决定是否用另一个提示呈现另一个 PromptVC
或关闭整个 UINavigationController(一直持有所有提示)。
"So what's the problem? Just combine the PromptManager
and the PromptVC
into a PromptActivity
."
啊,如果我们可以...如果 Firebase 中的值更改触发提示会怎样? PromptActivity
必须始终存在并准备好听到这些更改 - 根据上面的 "Core issues" 这是有问题的。此外,如前所述,这些提示是许多需要根据 Firebase 数据事件进行更改的实例之一,因此我们最终会得到数十个(或更多)永远不会关闭的活动,因为它们正在收听 Firebase参考。
理想世界
Singleton"DisplayManagers"负责监听数据然后creating/updating/managing/dismissingActivities。他们与 show/hide 自身的不同 Activity 交互,并在当前 Activity 内更新数据。但要做到这一点,我们需要能够保留对我们从这些单例创建的活动的引用。
看在世上所有美好事物的份上,有谁知道 Android 上是否可能出现这样的模式?因为它在 iOS...
上很漂亮我肯定会为此使用一个 Activity,并使用多个片段。
片段可以在先显示或不先显示的情况下创建和销毁,因此您可以完全控制它们的生命周期。
1 个 Fragment 中可以有多个Activity。
Fragment 可以根据呈现给它们的数据创建所需的布局。
您永远不应依赖当前未显示的 Activity。如果需要释放内存,Android 可以随时终止这些活动(尽管这种情况极为罕见,主要是在低端手机上)。
要侦听 Firebase 事件,您应该有一个服务来处理它。 该服务不直接绑定到任何 Activity/Fragment,而是独立存在。
然后每当您显示一个片段时,它都会向该服务添加一个侦听器。然后服务可以使用该侦听器通知片段任何传入的更改,片段可以相应地采取行动。
你应该看看 RxAndroid 库。它实际上是为了根据来自各种来源的传入事件来调整 UI,并保持所有数据同步。
如有任何疑问,请随时提出,但这种设置在 Android.
上是绝对可行的编辑:
回复评论(在这里写长消息比在评论中更容易):
该服务将绑定到每个 Activity(称为 "Bound Services"),并且 Activity 将保存对 Activity 中所有片段的引用。因此,该服务可以调用 Activity,而 Activity 会相应地采取行动(remove/add 碎片、自行解散等)。
这也可能是另一种方式,即 Activity 使用一些数据调用服务,并且服务可以做一些事情(比如调用后端 API 或类似的)。
Services 的好处是它们继承自 Context。这意味着您可以直接从您的服务开始新的活动。
PS:"were hoping to migrate our iOS implementations fairly directly to Android",谢谢你的笑声:)