如何防止系统终止我的'前台'服务?

问题描述:

我正在构建一个类似于Runtastic/Endomondo/Strava的应用程序,它需要获取GPS位置的服务,直到用户停止它的显示。如何防止系统终止我的'前台'服务?

我跑Runtastic和我的应用程序来尝试它。 Runtastic很好。但是我的应用程序丢失了通知在状态栏中的所有数据。我认为服务会自行重启,或者Android会终止我的服务。

我在LG G3上测试了应用程序,配备2GB内存,我认为它足够运行Runtastic和我的应用程序。

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

  • 我试着START_STICKY标志启动该服务的方法onStartCommand

  • 我试图用startForeground方法来启动服务

  • 我已经试过AQUIRE一个WakeLock

继文档(https://developer.android.com/guide/topics/processes/process-lifecycle.html)我的服务应该是 'A可见的过程'。

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

¿我应该声明服务作为的Manifest.xml过程?

+0

'startForeground'应该做的诀窍,如果你正确实施它 –

+0

@VladMatvienko我已经使用它。但我的服务被系统杀死。请你可以看看要点吗?也许我犯了一个错误。不管怎么说,还是要谢谢你! – cpalosrejano

+0

好吧,它不显示你如何开始你的服务 –

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

你不知道。前台服务是最好的,你可以得到。

但我的应用程序,失去altought通知所有的数据是在状态栏尚未

您的数据保存到数据库中,SharedPreferences,文件或服务器。一个进程不是一个持久的数据存储。

+0

当用户停止服务时,我已经将数据保存在数据库中。主要的问题是服务被系统杀死,导致在用户停止显式服务之前丢失了我的服务的所有变量。所以,我需要保持服务清醒,直到用户决定停止服务。 – cpalosrejano

+0

@cpalosrejano:“当用户停止服务时,我已经将数据保存在数据库中了” - 这太迟了。数据更改时可能保存数据,可能是批量。 “我需要保持服务清醒,直到用户决定停止服务” - 不,您需要在数据更改时保存数据。 – CommonsWare

+0

所以,前台服务是我能得到的最好的服务。这确保了服务不会在系统运行在低内存时被杀死,不是吗?如果是这样,我应该避免在我的服务上保存变量,以避免消耗内存。谢谢! – cpalosrejano