Java 试图了解我是否需要WakeLock

Java 试图了解我是否需要WakeLock,java,android,Java,Android,免责声明:我的应用程序已经在没有任何唤醒锁的情况下运行了1年多,并且对于大多数设备来说一切正常 我正在跟踪GPS,它的工作原理如下: AlarmReceiver每5/10/15分钟启动一次服务(如用户所愿) 服务订阅位置更新,并最多等待1分钟以获得良好的GPS 结束,将数据发送到服务器并关闭服务 由于不良连接和不良位置-整个过程有时需要2-3分钟。它是有效的。无论手机是否处于睡眠状态 现在我在读关于WakeLock的书,但我觉得它毫无意义。我的东西怎么会起作用?这是巧合吗 很好地阅读文档 报警管

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

我正在跟踪GPS,它的工作原理如下:

  • AlarmReceiver每5/10/15分钟启动一次服务(如用户所愿)
  • 服务订阅位置更新,并最多等待1分钟以获得良好的GPS
  • 结束,将数据发送到服务器并关闭服务
  • 由于不良连接和不良位置-整个过程有时需要2-3分钟。它是有效的。无论手机是否处于睡眠状态

    现在我在读关于WakeLock的书,但我觉得它毫无意义。我的东西怎么会起作用?这是巧合吗

    很好地阅读文档

    报警管理器保持CPU唤醒锁,直到报警结束 接收方的onReceive()方法正在执行

    进一步

    注意:报警管理器适用于您希望 应用程序代码在特定时间运行,即使应用程序 当前未运行。对于正常定时操作(滴答声, 超时等)使用处理程序更简单、更高效

    所以基于此。。我认为这是有道理的,它目前的工作;如果我错了,请纠正我

    我的东西怎么会起作用

    一系列的事情,包括一点点运气。:-)

    首先,正如Joel所指出的,设备会因您的闹钟而短暂唤醒,但操作系统仅保证在
    广播接收器的
    onReceive()
    期间保持
    唤醒锁

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

    在您的方法中仍然存在潜在的差距(例如,如果您将工作委托给
    服务
    ,并且没有持有
    唤醒锁
    ,作为向该服务传递控制权的一部分)。从统计上讲,它可能偶尔会失败,但在很多时候都会起作用


    就个人而言,我建议使用
    唤醒锁
    ,以防未记录的行为发生变化

    啊,是的,经典问题。“有效,但……不应该?”嗯……)实际上,在调用AsyncTask之前,我会删除更新。但我确实订阅了异步任务更新和完成服务。大约要进行5次HTTP调用,因此在调用
    removeUpdates
    后至少要花费5秒钟以上的时间。事实上,我希望你能回答,因为我考虑过切换到你的
    WakefulIntentService
    ,因为这更像是我所做的。@katit:
    WakefulIntentService
    不适用于必须持续时间超过
    doWakefulWork()
    的工作,例如从
    LocationManager
    异步接收位置。“wakeful”属性是好的,但IntentService的基础不是好的。这就是为什么我写了
    LocationPoller
    ,作为不同服务中相同“唤醒”概念的一个例子。