public class IdleModeReceiver extends BroadcastReceiver { private PowerManager powerManager; private PowerManager.WakeLock wakeLock; @TargetApi(Build.VERSION_CODES.M) @Override public void onReceive(Context context, Intent intent) { try { powerManager = (PowerManager) context.getSystemService(POWER_SERVICE); wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TimeTickWakeLog"); wakeLock.acquire(30 * 1000); if (powerManager.isDeviceIdleMode()) { // the device is now in doze mode MyLog.d("power manager : doze mode"); } else if (powerManager.isInteractive()){ // the device is in iteractive mode MyLog.d("power manager : interactive mode"); } else if (powerManager.isPowerSaveMode()) { // the device is in power save mode MyLog.d("power manager : power save mode"); } if (wakeLock != null) { wakeLock.release(); powerManager = null; wakeLock = null; } } catch (Exception ex) { ex.printStackTrace(); MyLog.ex(ex); if (wakeLock != null) { wakeLock.release(); powerManager = null; wakeLock = null; } } } }
for older devices add to manifest file:
<receiver android:name=".IdleModeReceiver"> <intent-filter> <action android:name=" android.os.action.DEVICE_IDLE_MODE_CHANGED" /> </intent-filter> </receiver>
for new devices:
private IdleModeReceiver idleModeReceiver = new IdleModeReceiver(); // register idle change if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { IntentFilter filter = new IntentFilter(); filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED); registerReceiver(idleModeReceiver, filter); }
References
https://developer.android.com/reference/android/os/PowerManager
https://stackoverflow.com/questions/31559698/android-m-listening-to-android-os-action-device-idle-mode-changed