3

免责声明:我的应用程序已经在没有任何唤醒锁的情况下运行了 1 年以上,并且对于大多数设备来说一切都很好。

我正在跟踪 GPS,它的工作原理是这样的:

  1. AlarmReceiver 每 5/10/15 分钟启动一次服务(根据用户的意愿)
  2. 服务订阅位置更新并等待 MAX 1 分钟以获得良好的 GPS。
  3. 结束,将数据发送到服务器并关闭服务。

由于糟糕的连接和糟糕的位置 - 整个过程有时需要 2-3 分钟。它有效。无论手机是否处于睡眠状态。

现在我正在阅读有关 WakeLock 的内容,这对我来说没有意义。我的东西怎么能用?这是巧合吗?

4

2 回答 2

1

我的东西怎么能用?

各种事物的组合,包括一团运气。:-)

首先,正如 Joel 所指出的,设备会因您的闹钟而短暂唤醒,但操作系统只能保证在 aWakeLock的持续时间内保持onReceive()a BroadcastReceiver

至少在某些版本的 Android 上,请求 GPS 更新可能会导致操作系统获取自己的WakeLock. 这是 AFAIK 的无证行为,我个人从未依赖过它。但是,如果确实如此,并且您在删除位置更新之前正在完成其余的工作(“总结,将数据发送到服务器并关闭服务”),那将解释该行为。

您的方法仍然存在潜在的差距(例如,如果您委派给 aService来完成工作并且没有持有 aWakeLock作为将控制权传递给该服务的一部分)。从统计上讲,它可能偶尔会失败,但很多时候都可以工作。

就个人而言,我建议使用WakeLock, 以防未记录的行为发生变化。这就是我在LocationPoller.

于 2012-07-27T00:07:59.990 回答
0

AlarmManager文档中阅读得很好..

只要警报接收器的 onReceive() 方法正在执行,警报管理器就会持有 CPU 唤醒锁。

更远...

注意:警报管理器适用于您希望应用程序代码在特定时间运行的情况,即使您的应用程序当前没有运行。对于正常的计时操作(滴答声、超时等),使用 Handler 更容易、更高效。

因此,基于此.. 我认为它目前有效是有道理的;如我错了请纠正我。

于 2012-07-26T23:08:41.917 回答