应用程序关闭后执行RxAndroid Observables

时间:2017-12-27 17:39:11

标签: android rx-java background-process rx-android

Android应用程序关闭后是否可以保持我的Observable运行?

在我的示例中,我必须以10秒的间隔发送用户的位置。我最初认为订阅Schedulers.newThread()会做到这一点,但是,每当我关闭应用程序时,进程就会停止。有什么方法可以用RxAndroid做到这一点吗?

以下是我使用的方法:

private void startShiftLocationUpdater() {

    Observable.interval(10, TimeUnit.SECONDS)
            .flatMap(l -> shouldSendLocation())
            .takeWhile(shouldSend -> shouldSend)
            .flatMap(shouldSend -> initUpdateLocationShift())
            .subscribeOn(Schedulers.newThread())
            .subscribe(s -> {
                repository.updateShift(s);
                Log.i("ShiftUpdate", "Shift updated successfully");
            }, Crashlytics::logException, () ->
                Log.i("ShiftUpdate", "Shift updated completed")
            );
}

1 个答案:

答案 0 :(得分:1)

您可以使用services继续在后台和wakelocks执行代码,但我必须在您描述的内容中执行类似操作,并发现如果Android系统需要,服务可以随时被杀死自由记忆。

我找到的解决方案是使用alarms,如果您安排闹钟,无论您的应用是否仍在执行,都会触发此警报。这样,即使系统由于缺乏资源而杀死了应用程序,我的应用程序也可以获得设备位置。它是我发现在这种情况下有效的唯一解决方案。

当他们说如果你真的需要你的应用程序继续使用警报而不是服务时,我想在谷歌i / o中找到了这个想法。

我遇到的唯一问题是,在某些特定的华为设备上,必须在创建它们之前的5分钟内执行的警报在5分钟后才开始,而不是在您设置的时间。所以,我最终制定了一个涉及服务和警报的解决方案。这样,当服务运行时警报到达,服务停止并重新启动并检索到一个位置。在特定的华为设备中,该服务始终执行发送位置,但如果由于某种原因,应用程序被杀死,则警报将在不到5分钟内恢复所有内容。

那一刻我没有使用Rx,就在不久之前,使用闹钟是解决方案,不会失去任何路线。我们的应用程序被广泛使用,我之所以不说这个名字只是因为我不想在这里发送垃圾邮件。

我希望我能很好地解释这个警报问题。如果您需要更多信息,请询问。