我使用标志RTC_WAKEUP设置警报,每隔30秒运行一次IntentService,以将位置更新传输到服务器。我打算将标志更改为RTC,这样它就不会唤醒手机而只是在另一个进程唤醒手机时运行。如果我注册了LocationListener,它会在手机处于睡眠状态时监听位置更新吗?
答案 0 :(得分:2)
是的 - 工作位置服务有它自己的唤醒锁。然而,更好的方法是在广播接收器中手动设置适当的唤醒锁定。请考虑一些优化 - 每隔30秒通过网络发送数据会耗尽电池。
答案 1 :(得分:2)
这里有多个问题。
我使用标志RTC_WAKEUP设置一个警报,每隔30秒运行一次IntentService,将位置更新传输到服务器。
首先,您甚至可能无法在30秒内完成首次修复,尤其是在使用GPS时。您需要考虑到从不获得修复(例如,用户位于地下位置)。
其次,请允许此数字是用户可配置的,包括“我将手动上传数据请”的选项。正如@piotrpo所指出的,这是对电池的重大消耗。事实上,如果你使用GPS,我怀疑电池会持续使用几个小时。
第三,IntentService
在这种情况下效果不佳,因为IntentService
会在修复程序到达之前关闭。充其量,你会泄漏内存。在最坏的情况下,您将无法获得修复,因为Android会终止您的过程。
进行后台位置检查的更好解决方案是使用常规Service
,而不是IntentService
。常规服务会在LocationListener
中注册onStartCommand()
,并在没有修复的情况下安排超时通知(例如AlarmManager
和set()
)。修复程序到达后,运行AsyncTask
进行上传。当AsyncTask
完成,或者超时到达并且您没有得到修复时,取消注册侦听器并调用stopSelf()
以关闭该服务。在此过程中,您需要维护自己的WakeLock
,以便在所有这些过程中保持设备处于唤醒状态。
有关大部分内容的示例(减去服务器上传部分),请参阅我的LocationPoller
。
如果你每隔30秒钟左右就会发生这种情况,你可能根本不会打扰AlarmManager
。您必须拥有一个永久性服务,一直在运行,具有永久WakeLock
和永久LocationListener
。当修复程序到达onLocationChanged()
时,如果修补程序距离上一个修复程序超过30秒,请将其上传。并且,当你发布应用程序时,一定要穿防火服,因为那些运行它的人可能不喜欢结果。