/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.support.v4.app; import android.app.AlarmManager; import android.app.PendingIntent; import android.os.Build; /** * Compatibility library for {@link AlarmManager} with fallbacks for older platforms. */ public final class AlarmManagerCompat { /** * Schedule an alarm that represents an alarm clock. * * The system may choose to display information about this alarm to the user. * *
* This method is like {@link #setExact}, but implies * {@link AlarmManager#RTC_WAKEUP}. * * @param alarmManager AlarmManager instance used to set the alarm * @param triggerTime time at which the underlying alarm is triggered in wall time * milliseconds since the epoch * @param showIntent an intent that can be used to show or edit details of * the alarm clock. * @param operation Action to perform when the alarm goes off; * typically comes from {@link PendingIntent#getBroadcast * IntentSender.getBroadcast()}. * * @see AlarmManager#set * @see AlarmManager#setRepeating * @see AlarmManager#setWindow * @see #setExact * @see AlarmManager#cancel * @see AlarmManager#getNextAlarmClock() * @see android.content.Context#sendBroadcast * @see android.content.Context#registerReceiver * @see android.content.Intent#filterEquals */ public static void setAlarmClock(AlarmManager alarmManager, long triggerTime, PendingIntent showIntent, PendingIntent operation) { if (Build.VERSION.SDK_INT >= 21) { alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(triggerTime, showIntent), operation); } else { AlarmManagerCompat.setExact(alarmManager, AlarmManager.RTC_WAKEUP, triggerTime, operation); } } /** * Like {@link AlarmManager#set(int, long, PendingIntent)}, but this alarm will be allowed to * execute even when the system is in low-power idle modes. This type of alarm must only * be used for situations where it is actually required that the alarm go off while in * idle -- a reasonable example would be for a calendar notification that should make a * sound so the user is aware of it. When the alarm is dispatched, the app will also be * added to the system's temporary whitelist for approximately 10 seconds to allow that * application to acquire further wake locks in which to complete its work.
* *These alarms can significantly impact the power use * of the device when idle (and thus cause significant battery blame to the app scheduling * them), so they should be used with care. To reduce abuse, there are restrictions on how * frequently these alarms will go off for a particular application. * Under normal system operation, it will not dispatch these * alarms more than about every minute (at which point every such pending alarm is * dispatched); when in low-power idle modes this duration may be significantly longer, * such as 15 minutes.
* *Unlike other alarms, the system is free to reschedule this type of alarm to happen * out of order with any other alarms, even those from the same app. This will clearly happen * when the device is idle (since this alarm can go off while idle, when any other alarms * from the app will be held until later), but may also happen even when not idle.
* *Regardless of the app's target SDK version, this call always allows batching of the * alarm.
* * @param alarmManager AlarmManager instance used to set the alarm * @param type One of {@link AlarmManager#ELAPSED_REALTIME}, * {@link AlarmManager#ELAPSED_REALTIME_WAKEUP}, * {@link AlarmManager#RTC}, or {@link AlarmManager#RTC_WAKEUP}. * @param triggerAtMillis time in milliseconds that the alarm should go * off, using the appropriate clock (depending on the alarm type). * @param operation Action to perform when the alarm goes off; * typically comes from {@link PendingIntent#getBroadcast * IntentSender.getBroadcast()}. * * @see AlarmManager#set(int, long, PendingIntent) * @see #setExactAndAllowWhileIdle * @see AlarmManager#cancel * @see android.content.Context#sendBroadcast * @see android.content.Context#registerReceiver * @see android.content.Intent#filterEquals * @see AlarmManager#ELAPSED_REALTIME * @see AlarmManager#ELAPSED_REALTIME_WAKEUP * @see AlarmManager#RTC * @see AlarmManager#RTC_WAKEUP */ public static void setAndAllowWhileIdle(AlarmManager alarmManager, int type, long triggerAtMillis, PendingIntent operation) { if (Build.VERSION.SDK_INT >= 23) { alarmManager.setAndAllowWhileIdle(type, triggerAtMillis, operation); } else { alarmManager.set(type, triggerAtMillis, operation); } } /** * Schedule an alarm to be delivered precisely at the stated time. * ** This method is like {@link AlarmManager#set(int, long, PendingIntent)}, but does not permit * the OS to adjust the delivery time. The alarm will be delivered as nearly as * possible to the requested trigger time. * *
* Note: only alarms for which there is a strong demand for exact-time * delivery (such as an alarm clock ringing at the requested time) should be * scheduled as exact. Applications are strongly discouraged from using exact * alarms unnecessarily as they reduce the OS's ability to minimize battery use. * * @param alarmManager AlarmManager instance used to set the alarm * @param type One of {@link AlarmManager#ELAPSED_REALTIME}, * {@link AlarmManager#ELAPSED_REALTIME_WAKEUP}, * {@link AlarmManager#RTC}, or {@link AlarmManager#RTC_WAKEUP}. * @param triggerAtMillis time in milliseconds that the alarm should go * off, using the appropriate clock (depending on the alarm type). * @param operation Action to perform when the alarm goes off; * typically comes from {@link PendingIntent#getBroadcast * IntentSender.getBroadcast()}. * * @see AlarmManager#set * @see AlarmManager#setRepeating * @see AlarmManager#setWindow * @see AlarmManager#cancel * @see android.content.Context#sendBroadcast * @see android.content.Context#registerReceiver * @see android.content.Intent#filterEquals * @see AlarmManager#ELAPSED_REALTIME * @see AlarmManager#ELAPSED_REALTIME_WAKEUP * @see AlarmManager#RTC * @see AlarmManager#RTC_WAKEUP */ public static void setExact(AlarmManager alarmManager, int type, long triggerAtMillis, PendingIntent operation) { if (Build.VERSION.SDK_INT >= 19) { alarmManager.setExact(type, triggerAtMillis, operation); } else { alarmManager.set(type, triggerAtMillis, operation); } } /** * Like {@link #setExact}, but this alarm will be allowed to execute * even when the system is in low-power idle modes. If you don't need exact scheduling of * the alarm but still need to execute while idle, consider using * {@link #setAndAllowWhileIdle}. This type of alarm must only * be used for situations where it is actually required that the alarm go off while in * idle -- a reasonable example would be for a calendar notification that should make a * sound so the user is aware of it. When the alarm is dispatched, the app will also be * added to the system's temporary whitelist for approximately 10 seconds to allow that * application to acquire further wake locks in which to complete its work.
* *These alarms can significantly impact the power use * of the device when idle (and thus cause significant battery blame to the app scheduling * them), so they should be used with care. To reduce abuse, there are restrictions on how * frequently these alarms will go off for a particular application. * Under normal system operation, it will not dispatch these * alarms more than about every minute (at which point every such pending alarm is * dispatched); when in low-power idle modes this duration may be significantly longer, * such as 15 minutes.
* *Unlike other alarms, the system is free to reschedule this type of alarm to happen * out of order with any other alarms, even those from the same app. This will clearly happen * when the device is idle (since this alarm can go off while idle, when any other alarms * from the app will be held until later), but may also happen even when not idle. * Note that the OS will allow itself more flexibility for scheduling these alarms than * regular exact alarms, since the application has opted into this behavior. When the * device is idle it may take even more liberties with scheduling in order to optimize * for battery life.
* * @param alarmManager AlarmManager instance used to set the alarm * @param type One of {@link AlarmManager#ELAPSED_REALTIME}, * {@link AlarmManager#ELAPSED_REALTIME_WAKEUP}, * {@link AlarmManager#RTC}, or {@link AlarmManager#RTC_WAKEUP}. * @param triggerAtMillis time in milliseconds that the alarm should go * off, using the appropriate clock (depending on the alarm type). * @param operation Action to perform when the alarm goes off; * typically comes from {@link PendingIntent#getBroadcast * IntentSender.getBroadcast()}. * * @see AlarmManager#set * @see AlarmManager#setRepeating * @see AlarmManager#setWindow * @see AlarmManager#cancel * @see android.content.Context#sendBroadcast * @see android.content.Context#registerReceiver * @see android.content.Intent#filterEquals * @see AlarmManager#ELAPSED_REALTIME * @see AlarmManager#ELAPSED_REALTIME_WAKEUP * @see AlarmManager#RTC * @see AlarmManager#RTC_WAKEUP */ public static void setExactAndAllowWhileIdle(AlarmManager alarmManager, int type, long triggerAtMillis, PendingIntent operation) { if (Build.VERSION.SDK_INT >= 23) { alarmManager.setExactAndAllowWhileIdle(type, triggerAtMillis, operation); } else { AlarmManagerCompat.setExact(alarmManager, type, triggerAtMillis, operation); } } private AlarmManagerCompat() { } }