Android LocationListener在电话睡着时离开

时间:2011-08-11 17:45:30

标签: android gps locationlistener

我使用标志RTC_WAKEUP设置警报,每隔30秒运行一次IntentService,以将位置更新传输到服务器。我打算将标志更改为RTC,这样它就不会唤醒手机而只是在另一个进程唤醒手机时运行。如果我注册了LocationListener,它会在手机处于睡眠状态时监听位置更新吗?

2 个答案:

答案 0 :(得分:2)

是的 - 工作位置服务有它自己的唤醒锁。然而,更好的方法是在广播接收器中手动设置适当的唤醒锁定。请考虑一些优化 - 每隔30秒通过网络发送数据会耗尽电池。

答案 1 :(得分:2)

这里有多个问题。

  

我使用标志RTC_WAKEUP设置一个警报,每隔30秒运行一次IntentService,将位置更新传输到服务器。

首先,您甚至可能无法在30秒内完成首次修复,尤其是在使用GPS时。您需要考虑到从不获得修复(例如,用户位于地下位置)。

其次,请允许此数字是用户可配置的,包括“我将手动上传数据请”的选项。正如@piotrpo所指出的,这是对电池的重大消耗。事实上,如果你使用GPS,我怀疑电池会持续使用几个小时。

第三,IntentService在这种情况下效果不佳,因为IntentService会在修复程序到达之前关闭。充其量,你会泄漏内存。在最坏的情况下,您将无法获得修复,因为Android会终止您的过程。

进行后台位置检查的更好解决方案是使用常规Service,而不是IntentService。常规服务会在LocationListener中注册onStartCommand(),并在没有修复的情况下安排超时通知(例如AlarmManagerset())。修复程序到达后,运行AsyncTask进行上传。当AsyncTask完成,或者超时到达并且您没有得到修复时,取消注册侦听器并调用stopSelf()以关闭该服务。在此过程中,您需要维护自己的WakeLock,以便在所有这些过程中保持设备处于唤醒状态。

有关大部分内容的示例(减去服务器上传部分),请参阅我的LocationPoller

如果你每隔30秒钟左右就会发生这种情况,你可能根本不会打扰AlarmManager。您必须拥有一个永久性服务,一直在运行,具有永久WakeLock和永久LocationListener。当修复程序到达onLocationChanged()时,如果修补程序距离上一个修复程序超过30秒,请将其上传。并且,当你发布应用程序时,一定要穿防火服,因为那些运行它的人可能不喜欢结果。