我认为这个问题在stackoverflow中被多次询问,但仍然有很多人在努力解决它。
在我的Android应用程序中,我必须每30分钟唤醒设备以获取当前位置并将其发送到服务器。为此,我使用了带有setExactAndAllowWhileIdle()方法和WakefulBroadcastReceiver的AlarmManager。它几乎适用于所有标准/流行设备,但其他一些设备主要是中国设备不支持或不允许设备通过setExactAndAllowWhileIdle()从打盹模式唤醒。我在Moto G4 plus(Android OS 6.1)设备上进行了测试,不允许警报管理器在特定时间间隔内唤醒。
我正在使用AlarmManager来调用wakefulBroadcastReceiver,它会唤醒wakefulIntentservice以执行后台任务。但它的排水电池非常严重,并且还处于打瞌睡模式(Nougat),它没有做背景任务。除此之外,它从后端服务捕获数据。
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 - &gt;
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();
答案 0 :(得分:0)
我恐怕只有部分答案。
根据我的经验,你不应该释放wakeLock。我注意到如果停止唤醒锁,Motorolas怎么不醒来。不幸的是因为它使用了更多的电池。如果你在三星手机上这样做,你的电池使用率会变得非常高。所以我建议你插入一个条件,如果该品牌是摩托罗拉(和其他人),你不会发布唤醒锁。 我很欣赏它是一个黑客但它对我有用。