setExactAndAllowWhileIdle - is not exact as of developer reference

后端 未结 5 1622
面向向阳花
面向向阳花 2020-11-29 00:40

AlarmManager on API19 has the method setExact() to set an exact alarm.

Exact means --> If I set an alarm to 2:01 p

5条回答
  •  执念已碎
    2020-11-29 00:57

    I was trying to create an automation system running in the background. My frequency range was between 1-15 minutes. My wish was not to use a foreground service. By looking at the name of the method "setExactAndAllowWhileIdle", I thought that yeah it is safe to go with one-time alarms, scheduling the next one when done.

    However, I couldn't find a way to run code in doze mode with alarms running more frequent than 15 minutes. Instead, I choose to start a foreground service when doze mode gets activated and stop that foreground service when phone awakes. User won't be seeing your foreground notification while using his/her phone. I don't care much about the ones in doze mode.

    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if(intent.getAction().equals("android.os.action.DEVICE_IDLE_MODE_CHANGED")){
            if (pm.isDeviceIdleMode()) {
                //startAutomationForegroundService();
            } else {
                //stopAutomationForegroundService();
                return;
            }
            AutomationReceiver.completeWakefulIntent(intent);
            return;
        }
    }
    

    You need to register "android.os.action.DEVICE_IDLE_MODE_CHANGED" intent filter into your WakefulBroadcastReceiver. Care putting it into manifest may not help.

提交回复
热议问题