【问题标题】:Doze mode sleeps Google's Geofence sample application打盹模式使 Google 的地理围栏示例应用程序休眠
【发布时间】:2017-06-12 17:26:24
【问题描述】:

我有一个使用地理围栏的 android 应用程序,但我很难克服打盹模式。我的清单具有 WAKE_LOCK 权限,并且每个区域的七个 setNotificationResponsiveness 为 0。我什至将 PendingIntent 更改为 BroadcastReceiver,但应用程序在删除智能手机屏幕的情况下确实会在一段时间后休眠或死机。我已经尝试过使用 LocationRequest

LocationRequest.setFastestInterval(1000);
LocationRequest.setInterval(2000);

即便如此,我还是没有成功。有没有人设法通过 Doze 保持应用程序运行?

【问题讨论】:

    标签: android android-geofence android-doze


    【解决方案1】:

    我在我的聊天应用程序和位置跟踪应用程序中遇到了问题,在打瞌睡模式下,我们不会收到任何推送,或者我们不会获得任何网络连接或位置详细信息,并且大部分后台操作会因为电池而被阻止优化,我们可以通过两种方式解决。

    1. 优先推送消息(我在我的聊天应用程序中使用过) - 如果您发送正常推送它不会到达应用程序,直到手机恢复正常,如果您发送优先推送它将到达应用程序您可以做一些几秒钟内完成,但这也有一些限制。

    2. 前台服务,- 对于您的场景,这是最好的解决方案,您应该有服务并且该服务应该作为前台服务运行,这样即使在打盹模式下,您也可以随时获取位置信息。

    【讨论】:

    • 第2项你有样品吗(前台服务)?我一直在研究这个主题并试图构建这个解决方案。但是我的场景不知道我做错了还是不适合设计。我有一个 gps 类,它在地理围栏事件发生时获取设备在此位置的位置,它会调用服务器以确定已激活的地理围栏区域以及设备的位置。
    • 如何应用此服务来更新位置?这个前台服务我看到帖子说我应该创建一个通知,然后我不明白为什么。奇怪的是 Google 没有通过使用 Doze 解决这个问题来更新 Geofence 的官方部分。
    • 目前该应用程序有一个AlarmManager,它会不时生成一个日志,我可以查看该应用程序是否尚未关闭或处于睡眠状态,但地理围栏系统似乎处于睡眠状态
    【解决方案2】:

    清单中的 WAKE_LOCK 权限不足以使用唤醒锁,您需要在代码中获取并释放锁,但从 Android 6 打盹模式开始,它也会通过获取的唤醒锁进入深度睡眠。

    打盹模式也适用于我:

    在主 Activity onStop 中,我获得了 Partial WakeLock,并以 STARTFOREGROUND_ACTION 意图启动了一个服务,该服务调用 startForeground 并显示一个通知。

    在 Activity onResume 释放 WakeLock 时,Service 以 STOPFOREGROUND_ACTION 意图停止,Service 本身调用 stopForeground 和 stopSelf。

    【讨论】:

    • 我得到了这个错误日志 WakeLock 在仍然持有的情况下完成:MyBroadcastReceiver。当应用程序仍然在后台并且设备屏幕关闭时会发生此错误。 MyBroadcastReceiver 现在扩展了 WakefulBroadcastReceiver。
    • 不带wake_lock试试,Service + startForeground就够了。
    • 不工作,当设备屏幕关闭时应用睡眠/死机。
    【解决方案3】:

    我最终让我的应用程序接收推送消息。显然该应用程序不再被操作系统杀死。

    【讨论】:

      猜你喜欢
      • 2014-07-25
      • 2013-07-08
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2014-09-10
      • 1970-01-01
      • 2015-10-14
      相关资源
      最近更新 更多