无限时间运行Android服务

时间:2011-10-13 17:16:37

标签: android service location

我有一个在后台运行的位置服务,并使用位置管理器每隔30秒向我的服务器发送lat和long值。我希望此服务无限长时间运行,直到用户停止服务。但我观察到的是几个小时后,服务消失了,因为它超过30多万桶。我想知道如果用户没有停止它,我怎么能让它运行?

我的观察很少(如果我错了,请纠正我): 在分配跟踪器中,占用内存的大多数对象是位置管理器对象。 在堆中,当我导致gc时,我的对象分配的内存消失了,所以我猜没有内存泄漏。 在应用程序 - >运行服务中,我看不到任何服务运行4个多小时。那么我想要做的是不可能的?

非常感谢任何帮助/建议。

提前致谢。

3 个答案:

答案 0 :(得分:4)

我不确定为什么你的服务开始占用超过30兆字节,但你可能会以某种方式泄漏内存。

最后,你的设计是有缺陷的。你能做的最好的事情是:

  1. 使用PendingIntent方法registerLocationUpdates注册位置更新。您可以在此处指定更新之间的minTime。
  2. 如果您需要每30秒精确发送一次位置更新,您还可以在AlarmManager中注册PendingIntent,以便每隔30秒发送一次意图。
  3. 让此PendingIntent启动IntentService。
  4. 让IntentService将位置数据发送到您的服务器。
  5. 当用户停止您的应用程序时,只需使用LocationManager(以及可能的AlarmManager)取消注册PendingIntents。

答案 1 :(得分:1)

  

我有一个在后台运行的位置服务,并使用位置管理器每隔30秒向我的服务器发送lat和long值。

请允许用户选择轮询期,包括“从不轮询”。

另外,请注意这会严重影响用户的电池。

  

我希望这项服务能够无限期地运行,直到用户停止服务为止。

这是不可能的。您最接近的是通过startForeground(),但即使这样也不能保证您的服务永远存在。

此外,这是Android中严重的反模式。用户讨厌试图永远运行的应用程序,这就是为什么我们必须与任务杀手等竞争。

  

但我观察到的是几个小时之后,服务消失了,因为它超过30多万桶。

在保持GPS开启并且设备始终处于唤醒状态的几个小时内,您的用户的电池将耗尽,此时您的服务和其他一切都将消失。

关于记忆,如果你认为你正在泄漏记忆,请使用MAT来追踪泄漏。

答案 2 :(得分:0)

为什么不以编程方式发出gc - 比如每小时说一次?

我不知道你想做什么是不可能的。我想毕竟应该是可能的。 让我想知道的是:为什么VM没有启动gc而反而崩溃?

可能存在内存泄漏问题?

Avoiding memory leaks - blogentry可能会提供一些提示。

如果你给我们一些你的代码,或许有人可以给你更复杂的建议吗?