2017-10-13 22 views
1

因此,我阅读了Android O的可怕文档,它说,一旦应用程序在后台,服务将会死亡,我应该重构我的代码以使用Foreground服务或作业调度程序。Android O - 我的服务已经在后台运行了20多分钟了。它不应该被停止吗?

在我的应用程序中,我将照片上传到服务器,并且如果服务器返回500错误或没有网络连接,那么无论应用程序处于前景还是应用程序中,我都有一项服务每隔5分钟重试一次不。它采用了Timer这样做

timer.scheduleAtFixedRate(new TimerTask() {

所以我升级我的手机到Android O和跑我的应用程序,把它的背景下,开设了10多个应用程序,并开始看logcat的。

现在,25分钟后,我的服务每5分钟继续运行计划的TimerTask

为什么它还活着,如果是这样的话,我重构我的应用程序是否有意义?

有一个类似的问题在这里: Android O - Background service limitation not working as expected

但得到的答复是太神秘,尤其是说,部分“过程可能会在任何时候终止。” - 这一直是Android的情况。这次更可能有不同程度的变化吗?

回答

1

为什么还活着

也许你的服务本身是不是活的,但你的服务泄漏其Timer,和你的进程仍然活着。由于你的问题没有明显的代码,我们只能猜测。

如果是这样的话,重构我的应用程序对我有意义吗?

是的。

这次更可能是不同程度的吗?

是的。进程的重要性是决定哪些进程终止(以及何时)由负责终止Android SDK进程以释放系统RAM的“OOM杀手”的关键指标。当您的服务运行时,您的进程只会具有更高的重要性(与普通的缓存进程相比)。 Android 8.0会停止该服务,但它不会立即终止该进程,从而允许普通的OOM杀手逻辑正常进行。从您的流程寿命的角度来看,它仍然是非确定性的,因为它一直存在,但短寿命的可能性要大得多。

此外,从用户的角度来看,您目前的实施并不是很好。 只有在服务正在向用户传递价值时才能运行,因为您正在捆绑系统RAM,因此用户可能更喜欢将其用于其他用途。观看时钟节拍不会主动向用户传递价值。

使用JobScheduler(如果你的minSdkVersion为21或更高版本)或它周围的兼容性包装,如Evernote的android-job(如果你的minSdkVersion低于21)。然后,您可以拥有与以前相同的基本功能,但可以实现更好的内存管理。而且,作为一个好处,你解决了这个Android 8.0的问题。

+0

谢谢。对我来说是21+,所以JobScheduler工作得很好。是的,我想我正在泄漏TimerTask - 它已启动,并且再也不会再次触摸,直到我将其取消为止。但onDestroy现在还没有被召唤超过50分钟。 –

+0

btw是RAM中的整个应用程序,如果服务/进程仍在运行,因为存在泄漏TimerTask,或者它只是这个组件被加载到内存中 –

+0

@KR:“它开始并且再也不会再次触摸,直到onDestroy取消它“ - 好的,那么你不会泄漏它。 “但是onDestroy现在还没有被召唤50分钟以上” - 你的'targetSdkVersion'是什么?对于'targetSdkVersion'为26+,或者如果用户手动要求Android为其启用后台优化(仅适用于出现在“电池责任”列表中的应用程序),则大约1分钟的服务生命周期为'targetSdkVersion'。 “如果服务/进程仍在运行,则是RAM中的整个应用程序” - 默认情况下,是。 – CommonsWare

相关问题