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")
);
}
答案 0 :(得分:1)
您可以使用services继续在后台和wakelocks执行代码,但我必须在您描述的内容中执行类似操作,并发现如果Android系统需要,服务可以随时被杀死自由记忆。
我找到的解决方案是使用alarms,如果您安排闹钟,无论您的应用是否仍在执行,都会触发此警报。这样,即使系统由于缺乏资源而杀死了应用程序,我的应用程序也可以获得设备位置。它是我发现在这种情况下有效的唯一解决方案。
当他们说如果你真的需要你的应用程序继续使用警报而不是服务时,我想在谷歌i / o中找到了这个想法。
我遇到的唯一问题是,在某些特定的华为设备上,必须在创建它们之前的5分钟内执行的警报在5分钟后才开始,而不是在您设置的时间。所以,我最终制定了一个涉及服务和警报的解决方案。这样,当服务运行时警报到达,服务停止并重新启动并检索到一个位置。在特定的华为设备中,该服务始终执行发送位置,但如果由于某种原因,应用程序被杀死,则警报将在不到5分钟内恢复所有内容。
那一刻我没有使用Rx,就在不久之前,使用闹钟是解决方案,不会失去任何路线。我们的应用程序被广泛使用,我之所以不说这个名字只是因为我不想在这里发送垃圾邮件。
我希望我能很好地解释这个警报问题。如果您需要更多信息,请询问。