打盹模式对我的应用至关重要
Posted
技术标签:
【中文标题】打盹模式对我的应用至关重要【英文标题】:Doze mode is making critical to my app 【发布时间】:2017-09-06 07:25:25 【问题描述】:我认为这个问题在 *** 中被问了很多次,但仍然有很多人在努力解决它。
在我的 android 应用程序中,我必须每 30 分钟唤醒一次设备以获取当前位置并将其发送到服务器。为此,我使用了具有 setExactAndAllowWhileIdle() 方法和 WakefulBroadcastReceiver 的 AlarmManager。它在几乎所有标准/流行设备中都可以正常工作,但其他一些设备主要是中国设备不支持或不允许使用 setExactAndAllowWhileIdle() 从打盹模式唤醒设备。我已经在 Moto G4 plus(Android OS 6.1) 设备上测试过它不允许闹钟管理器在特定的时间间隔唤醒。
我正在使用AlarmManager 调用wakefulBroadcastReceiver,它会触发wakefulIntentservice 来执行后台任务。但它严重耗尽电池并且处于打盹模式(牛轧糖),它不执行后台任务。除此之外,它从后端服务捕获数据。
my code is here->>
// Setup periodic alarm every 30 minutes
if (android.os.Build.VERSION.SDK_INT >= 23)
syncDbAlarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
intervalMillis, pIntent);
else if (android.os.Build.VERSION.SDK_INT >= 19
&& android.os.Build.VERSION.SDK_INT < 23)
syncDbAlarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, triggerAtMillis/*firstMillis*/,
intervalMillis, pIntent);
else
syncDbAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtMillis/*firstMillis*/,
intervalMillis, pIntent);
我也用过PowerManager-->
PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
"com.example.johnbravado");
wakeLock.acquire();
// Do Work
MyConstants.getInstance().msgReqAction(intent.getIntExtra(MyConstants.BROADCAST_DATA_REQ, 0));
wakeLock.release();
【问题讨论】:
【参考方案1】:恐怕我只有部分答案。
根据我的经验,您不应该释放唤醒锁。我注意到如果您停止唤醒锁,摩托罗拉是如何唤醒的。这是不幸的,因为它使用更多的电池。如果你在三星手机上这样做,你的电池使用量会变得非常高。所以我建议你插入一个条件,如果品牌是摩托罗拉(和其他),你不要释放唤醒锁。 我很欣赏这是一个 hack,但它对我有用。
【讨论】:
但是它消耗太多电池,甚至在进入睡眠(打盹)模式后无法工作。 @FabioC 不,我不会释放唤醒锁。默认情况下,进入睡眠模式后根本不会触发服务。以上是关于打盹模式对我的应用至关重要的主要内容,如果未能解决你的问题,请参考以下文章