Android ViewModel 观察者未从后台调用

ilu*_*a.b 6 android android-mvvm

我正在使用MVVM模式开发小型 Android 应用程序。我的问题是ViewModelMyActivity 中的观察者没有从后台调用。即使应用程序位于后台,我也需要调用它,以Notification向用户显示应用程序计算过程已完成且结果已准备就绪。

这是当前的实现,onCreate位于MyActivity

mainActivityViewModel.getTestResult().observe(MainActivity.this, new Observer<String>() {
        @Override
        public void onChanged(@Nullable String blogList) {
            Toast.makeText(getApplicationContext(), "test...", Toast.LENGTH_SHORT).show();
            if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)){
                //The app is in foreground - showDialog
            }else{
                //The app is in background - showNotification
            }
        }
Run Code Online (Sandbox Code Playgroud)

目前,仅当应用程序位于前台时才会调用此观察者 - 如果应用程序位于前台时完成进程 - 'showDialog' 将触发,如果应用程序位于后台 - showNotification 将触发 - 但只有在我打开之后再次打开该应用程序。这不是我试图实现的行为。请帮忙!谢谢。

Isa*_*sak 2

onChangedActivity仅当当前Lifecycle状态至少为 时才会被调用STARTEDonPause当您离开 时会被呼叫Activity,这意味着它至少不是STARTED

LiveData根本不适合您想要实现的行为。

我建议您改用前景Service。特别是如果所提到的“计算过程”是用户应该了解的。

编辑:假设您正在后台执行一些可能长时间运行的任务,并且您希望继续执行此任务,即使用户将离开甚至关闭您的Activity. 那么使用 aService是一个不错的选择,特别Service是如果任务是用户操作的结果,则使用前台。例如,用户单击“上传”按钮,前台Service执行任务,并且关联的内容Notification为“上传正在进行”。

您可以选择

  • 任务完成后始终显示新的Notification,无论Activity是否显示。这很常见。
  • Notification仅当当前Activity未启动时才显示,如果已启动,则在Activity视图中显示某些内容。

为了执行后一个选项,您需要了解 的当前Activity状态Lifecycle。您希望能够以某种方式从您的服务中进行以下检查:getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)

Activity在和之间进行通信的最佳方式Service绑定Service并扩展Binder服务中的类。

绑定后,您可以将Activity Lifecycle状态存储在 中的变量中Service,甚至将其Activity本身提供给Service.