【问题标题】:How to prevent the system kill my 'foreground' service?如何防止系统杀死我的“前台”服务?
【发布时间】:2017-04-05 11:51:19
【问题描述】:

我正在构建一个类似于 Runtastic/Endomondo/Strava 的应用程序,它需要一个服务来获取 GPS 位置,直到用户明确停止它。

我运行 Runtastic 和我的应用来尝试一下。 Runtastic 运行良好。但是我的应用程序丢失了所有数据,尽管通知还在状态栏中。我认为服务会自行重启,或者 Android 会杀死我的服务。

我在具有 2GB RAM 的 LG G3 上测试了该应用程序,我认为它足以运行 Runtastic 和我的应用程序。

所以,我的问题是¿保持服务在后台运行或避免系统杀死它的最佳方法是什么?我想模拟 Runtastic/Endomondo/Strava 的逻辑。这意味着,电池寿命无关紧要。

  • 我已尝试在方法 onStartCommand 上使用 START_STICKY 标志启动服务。

  • 我尝试使用startForeground方法启动服务

  • 我已尝试获取WakeLock

按照文档 (https://developer.android.com/guide/topics/processes/process-lifecycle.html),我的服务应该是“一个可见的过程”。

这是我的服务代码的要点:https://gist.github.com/cpalosrejano/cc1ab73c4819c3e84234f2d619421b93

¿我应该在 Manifest.xml 中将服务声明为进程吗?

【问题讨论】:

  • startForeground 如果您正确实施它应该可以解决问题
  • @VladMatvienko 我已经在使用它了。但是我的服务被系统杀死了。请你看一下要点吗?也许我犯了一个错误。还是谢谢!
  • 好的,它没有显示你如何启动你的服务
  • @VladMatvienko 我很抱歉。我只是添加了 FragmentMain 代码,我在其中启动服务。

标签: android service process kill foreground-service


【解决方案1】:

保持服务在后台运行或避免系统杀死它的最佳方法是什么?

你没有。前台服务是您可以获得的最佳服务。

但是我的应用程序丢失了所有数据,尽管通知还在状态栏中

将您的数据保存到数据库、SharedPreferences、文件或服务器。进程不是持久数据存储。

【讨论】:

  • 当用户停止服务时,我已经将数据保存在数据库中。主要问题是服务被系统杀死,这导致我的服务在用户明确停止之前丢失了所有变量。所以,我需要让服务保持清醒,直到用户决定停止它。
  • @cpalosrejano:“当用户停止服务时,我已经将数据保存在数据库中”——太晚了。当数据发生变化时保存数据,可能是批量保存。 “我需要保持服务处于唤醒状态,直到用户决定停止它”——不,您需要在数据更改时保存数据。
  • 所以,前台服务是我能得到的最好的。这向我保证了服务不会被杀死,直到系统在低内存上运行,不是吗?如果是,我应该避免在我的服务上保存变量,以避免消耗内存。谢谢!
  • @cpalosrejano:“这可以确保在系统运行在低内存上之前,服务不会被终止,不是吗?” -- 不,但它会延长您的流程的预期寿命。
  • 你好@CommonsWare。我尝试使用唤醒锁和 startForeground 创建一个空服务,但它仍然被系统杀死。如果可以的话,请看这里:stackoverflow.com/questions/44065485/why-my-service-is-killed-by-system/ 我知道我应该有什么不好的,因为如果 runtastic 可以始终运行他的服务,而我的服务被杀了!请帮帮我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多