【发布时间】:2016-06-17 15:31:21
【问题描述】:
我想每 30 秒触发一次 android 警报管理器(即使我的应用程序在后台处于深度睡眠状态),因为我需要每 30 秒收集一次 GPS 位置并上传到服务器。
AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(this, OnAlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 30000,
30000,
pi);
我使用了上面的代码,当设备处于非睡眠状态时它工作正常。但似乎它在睡眠状态下无法正常工作。 一段时间后,它会每隔 5 分钟触发一次。
我的应用程序在 android 5.0.2 Samsung Tablet 上运行。
我发现在 android 5.0 以上(特别是三星设备)中存在与警报管理器相关的问题 https://code.google.com/p/android/issues/detail?id=82001
有什么解决方法吗?
谢谢。
【问题讨论】:
-
如果这是由省电模式引起的,唯一的方法是手动将您的应用列入白名单并通过对话框通知您的用户。我在华为 Mate 7(棒棒糖和棉花糖)上遇到了类似的问题,他们也实现了自己的电源管理,没有办法摆脱这个问题。
-
还有一个警告:在将来的版本中,或者自 Marshmallow 以来的更好版本中,您不能使用此方法 (setRepeating)。而且 AlarmManager 只能每 9 分钟触发一次,因此这将是一项艰巨的任务,您必须采取一些变通方法。查看打盹模式文档:developer.android.com/training/monitoring-device-state/…
-
好的,谢谢。如果有任何其他方法可以在后台获取 GPS 位置?我的应用程序需要超过一天捕获 GPS 位置。我认为服务不是一个可靠的解决方案,大多数例子都是使用警报管理器/唤醒锁来实现这一点。
-
不是那种打瞌睡模式的东西。唯一的方法是列入白名单并使用 setExactAndAllowWhileIdle()。你必须确保你的应用程序不会进入待机状态,所以我认为唤醒、alarmManager 和前台服务的组合可能会起作用。但是您必须对此进行测试。打盹模式对用户有好处,但这里缺少的是,用户自己应该决定它,但这是不可能的。
-
我目前正在自己测试如何摆脱这种情况,因为我正在开发一个聊天应用程序,而一个聊天应用程序不应该进入待机状态。
标签: android alarmmanager