2011-07-09 58 views
0

我正在编写一个Android应用程序,其主Activity启动一项使其变得粘滞的服务。该服务重复发送HTTP POST到服务器,交换一些信息。只要手机的屏幕打开,此过程就可以正常工作,但一旦关闭屏幕,服务会在一段时间后停止。有什么方法可以保证我的服务无限期地运行吗?Android粘滞服务停止发送HTTP请求

+0

听起来你的代码有问题。你有没有看到logcat的异常?或者,你是否捕获了执行http请求的代码的异常并且没有记录错误?对我来说,这听起来像你的应用程序试图刷新活动中的某些内容,但活动已被破坏而不是暂停,然后服务失败。我这样说是因为我编码“停止”工作的任何服务的唯一原因是某件事引发了一个我没有注意到的例外。 – Augusto

回答

1

有什么办法可以保证我的服务一直运行下去吗?

此外,您应该不希望你的服务被“无限期地运行”。当然,你的用户不希望你的服务“无限期地运行”,因为这就是为什么他们会用任务杀手,在设置中的管理服务中的强制停止操作等等来攻击你。更不用说市场上所有可爱的一星级评级,讨论板上的选择评论等等,这些应用程序会触发。

此外,您的问题不在于您的服务本身没有运行,而是设备正在睡着。这很正常。用户想要他们的设备入睡 - 否则,他们的电池寿命将是可怕的。

服务向服务器重复发送HTTP POST,交换一些信息。

执行此操作的正确方法是使用AlarmManager触发代码以定期执行。您的用户应该能够控制期间(可能通过SharedPreference),包括“我将手动请求数据传输,谢谢”选项。并且,通过IntentService或类似的方法,你安排你的代码是开始AlarmManager,做它的工作,,然后关闭,以摆脱内存

获取AlarmManager唤醒设备退出睡眠模式不是那么困难(使用闹钟的味道),但保持设备唤醒的时间足够长,以便您可以执行HTTP请求。 HTTP请求无法在主应用程序线程上执行,因为它可能需要很长时间。一个配方是使用我的WakefulIntentService component,这是一个IntentService,使设备保持足够长的时间以使您的工作完成,然后关闭并允许设备重新入睡。

0

第一种方法:你还可以做什么来持续向服务器发送HTTP POSTS,你可以制作一个计时器,并在计时器的任务内完成。在类TimerTask的run()中,您可以启用startService(),并且只要完成HTTP POST工作,就会销毁该服务。因此定期启动该服务,并且不会有任何后台服务。

二:您还可以使用PowerManager.WakeLock

三:您可以使用AlarmManager在以前的答案进行讨论。