WhenActivated 在 App.OnSleep 之后调用但在 App.Resume 之后未调用

WhenActivated called after App.OnSleep and not called after App.Resume

我正在使用 ReactiveUI 开发 Xamarin Forms 应用程序,我注意到 Android.

上有一些奇怪的行为

第一页有一个 View 和 ViewModel 并且都实现了 WhenActivated

如果我启动应用程序并在显示 (XamarinForms) 第一页之前按主页按钮将应用程序发送到后台,那么我将有此函数调用顺序。 (如果在 phone 屏幕锁定时从调试模式从 VS 启动应用程序,则更容易重现)。

  1. App.OnStart - 好的
  2. App.OnSleep - 好的
  3. FirstPageViewModel.WhenActivated - 奇怪。为什么在 OnSleep 之后?
  4. FirstPageView.WhenActivated - 奇怪。为什么在 OnSleep 之后?

如果我恢复应用程序(第一页可见)

  1. App.Resume - 好的
  2. 没有调用 WhenActivated - 奇怪,但由于第 3 点和第 4 点

如果我将应用程序发送到后台并再次恢复它,一切都如预期的那样。

  1. App.OnSleep - 好的
  2. App.Resume - 好的
  3. FirstPageViewModel.WhenActivated - 好的
  4. FirstPageView.WhenActivated - 好的

这是设计使然吗?

并不是说 View Activation 中没有继承问题,但我认为这可能是正确的。

如果您正在启动您的应用程序,应用程序启动序列将会触发。然后应用程序会意识到它在启动序列后立即休眠。应用程序从睡眠状态恢复后,它会激活视图,因为它必须立即进入睡眠状态(我不确定这是真实世界的场景,屏幕锁定时如何启动应用程序?)

在 XF 中恢复应用程序时,只要 OS 没有垃圾回收,视图就已经激活。所以我希望视图重新激活。 View Activation 不是关于屏幕何时可见,而是实例化 ViewModel 或 View 之后的步骤。所以一般都是响应"ViewAppearing"和"View Disappearing"事件。

此外,iOS 和 Android 处理 "View Activation" 的方式不同。可能值得一读 Android Activity Lifecycle。您会注意到 activity 在被呈现后保持活动状态,直到被用户关闭或被 OS 收集。

我认为这不是关于 ReactiveUI 如何处理视图激活,而是更多关于 XF 如何在它支持的各种平台上抽象视图激活。

综上所述,是的,这是设计使然。