【发布时间】:2017-09-06 07:25:25
【问题描述】:
我认为这个问题在 stackoverflow 中被问了很多次,但仍然有很多人在努力解决它。
在我的 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();
【问题讨论】:
标签: android android-doze