I think this question is asked many time in stackoverflow but still so many people struggling to resolved it.
In my android app I have to wake up device for every 30 minutes to getting current location and send it to server. For this I have used AlarmManager with setExactAndAllowWhileIdle() method and WakefulBroadcastReceiver. Its working fine in almost all standard/popular devices, But some other devices mostly china devices not supporting or cannot allow device wake up from doze mode with setExactAndAllowWhileIdle(). I have tested it in Moto G4 plus(Android OS 6.1) device which not allow alarm manager to wake up in specific interval.
I am using AlarmManager to call wakefulBroadcastReceiver, which trigers wakefulIntentservice to perform background task. but its draining battery critically and also in doze mode(Nougat), its not doing background task. other than else, its capturing data from backend service.
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);
}
I have used PowerManager also-->
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();