AlarmManager.java revision e0a22b324d0e3157e570ea5f71cc682fa9696e01
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tateimport android.content.Context;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
21e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tateimport android.os.Build;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provides access to the system alarm services.  These allow you
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to schedule your application to be run at some point in the future.  When
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an alarm goes off, the {@link Intent} that had been registered for it
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is broadcast by the system, automatically starting the target application
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if it is not already running.  Registered alarms are retained while the
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device is asleep (and can optionally wake the device up if they go off
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * during that time), but will be cleared if it is turned off and rebooted.
32a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate *
33a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * <p>The Alarm Manager holds a CPU wake lock as long as the alarm receiver's
34a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * onReceive() method is executing. This guarantees that the phone will not sleep
35a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * until you have finished handling the broadcast. Once onReceive() returns, the
36a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * Alarm Manager releases this wake lock. This means that the phone will in some
37a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * cases sleep as soon as your onReceive() method completes.  If your alarm receiver
38a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * called {@link android.content.Context#startService Context.startService()}, it
39a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * is possible that the phone will sleep before the requested service is launched.
40a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * To prevent this, your BroadcastReceiver and Service will need to implement a
41a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * separate wake lock policy to ensure that the phone continues running until the
42a34df8a2ba450b2c2ad83ccbbac30b80e2706bb2Chris Tate * service becomes available.
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><b>Note: The Alarm Manager is intended for cases where you want to have
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * your application code run at a specific time, even if your application is
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not currently running.  For normal timing operations (ticks, timeouts,
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * etc) it is easier and much more efficient to use
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.Handler}.</b>
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>You do not
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instantiate this class directly; instead, retrieve it through
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Context.getSystemService(Context.ALARM_SERVICE)}.
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AlarmManager
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
57e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    private static final String TAG = "AlarmManager";
58e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Alarm time in {@link System#currentTimeMillis System.currentTimeMillis()}
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (wall clock time in UTC), which will wake up the device when
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it goes off.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RTC_WAKEUP = 0;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Alarm time in {@link System#currentTimeMillis System.currentTimeMillis()}
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (wall clock time in UTC).  This alarm does not wake the
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * device up; if it goes off while the device is asleep, it will not be
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * delivered until the next time the device wakes up.
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int RTC = 1;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Alarm time in {@link android.os.SystemClock#elapsedRealtime
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SystemClock.elapsedRealtime()} (time since boot, including sleep),
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which will wake up the device when it goes off.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ELAPSED_REALTIME_WAKEUP = 2;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Alarm time in {@link android.os.SystemClock#elapsedRealtime
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SystemClock.elapsedRealtime()} (time since boot, including sleep).
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This alarm does not wake the device up; if it goes off while the device
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is asleep, it will not be delivered until the next time the device
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * wakes up.
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ELAPSED_REALTIME = 3;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final IAlarmManager mService;
88e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    private final boolean mAlwaysExact;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * package private on purpose
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
93e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    AlarmManager(IAlarmManager service, Context ctx) {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService = service;
95e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate
96e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate        final int sdkVersion = ctx.getApplicationInfo().targetSdkVersion;
97e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate        mAlwaysExact = (sdkVersion < Build.VERSION_CODES.KEY_LIME_PIE);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Schedule an alarm.  <b>Note: for timing operations (ticks, timeouts,
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * etc) it is easier and much more efficient to use
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.os.Handler}.</b>  If there is already an alarm scheduled
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for the same IntentSender, it will first be canceled.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If the time occurs in the past, the alarm will be triggered
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * immediately.  If there is already an alarm for this Intent
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scheduled (with the equality of two intents being defined by
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#filterEquals}), then it will be removed and replaced by
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this one.
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The alarm is an intent broadcast that goes to a broadcast receiver that
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you registered with {@link android.content.Context#registerReceiver}
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or through the &lt;receiver&gt; tag in an AndroidManifest.xml file.
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Alarm intents are delivered with a data extra of type int called
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#EXTRA_ALARM_COUNT Intent.EXTRA_ALARM_COUNT} that indicates
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * how many past alarm events have been accumulated into this intent
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * broadcast.  Recurring alarms that have gone undelivered because the
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * phone was asleep may have a count greater than one when delivered.
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param type One of ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC or
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             RTC_WAKEUP.
12679074cd935854b497cb894046da13bb08a113982Jesse Wilson     * @param triggerAtMillis time in milliseconds that the alarm should go
12779074cd935854b497cb894046da13bb08a113982Jesse Wilson     * off, using the appropriate clock (depending on the alarm type).
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param operation Action to perform when the alarm goes off;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * typically comes from {@link PendingIntent#getBroadcast
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * IntentSender.getBroadcast()}.
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.os.Handler
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setRepeating
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #cancel
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.content.Context#sendBroadcast
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.content.Context#registerReceiver
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.content.Intent#filterEquals
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ELAPSED_REALTIME
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ELAPSED_REALTIME_WAKEUP
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RTC
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RTC_WAKEUP
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14379074cd935854b497cb894046da13bb08a113982Jesse Wilson    public void set(int type, long triggerAtMillis, PendingIntent operation) {
144e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate        setImpl(type, triggerAtMillis, 0, operation, mAlwaysExact);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Schedule a repeating alarm.  <b>Note: for timing operations (ticks,
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * timeouts, etc) it is easier and much more efficient to use
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.os.Handler}.</b>  If there is already an alarm scheduled
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for the same IntentSender, it will first be canceled.
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Like {@link #set}, except you can also
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * supply a rate at which the alarm will repeat.  This alarm continues
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * repeating until explicitly removed with {@link #cancel}.  If the time
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * occurs in the past, the alarm will be triggered immediately, with an
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * alarm count depending on how far in the past the trigger time is relative
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the repeat interval.
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If an alarm is delayed (by system sleep, for example, for non
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * _WAKEUP alarm types), a skipped repeat will be delivered as soon as
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * possible.  After that, future alarms will be delivered according to the
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * original schedule; they do not drift over time.  For example, if you have
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set a recurring alarm for the top of every hour but the phone was asleep
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from 7:45 until 8:45, an alarm will be sent as soon as the phone awakens,
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * then the next alarm will be sent at 9:00.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If your application wants to allow the delivery times to drift in
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * order to guarantee that at least a certain time interval always elapses
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * between alarms, then the approach to take is to use one-time alarms,
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scheduling the next one yourself when handling each alarm delivery.
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param type One of ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP}, RTC or
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             RTC_WAKEUP.
17579074cd935854b497cb894046da13bb08a113982Jesse Wilson     * @param triggerAtMillis time in milliseconds that the alarm should first
17679074cd935854b497cb894046da13bb08a113982Jesse Wilson     * go off, using the appropriate clock (depending on the alarm type).
17779074cd935854b497cb894046da13bb08a113982Jesse Wilson     * @param intervalMillis interval in milliseconds between subsequent repeats
17879074cd935854b497cb894046da13bb08a113982Jesse Wilson     * of the alarm.
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param operation Action to perform when the alarm goes off;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * typically comes from {@link PendingIntent#getBroadcast
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * IntentSender.getBroadcast()}.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.os.Handler
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #set
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #cancel
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.content.Context#sendBroadcast
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.content.Context#registerReceiver
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.content.Intent#filterEquals
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ELAPSED_REALTIME
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ELAPSED_REALTIME_WAKEUP
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RTC
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RTC_WAKEUP
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19479074cd935854b497cb894046da13bb08a113982Jesse Wilson    public void setRepeating(int type, long triggerAtMillis,
19579074cd935854b497cb894046da13bb08a113982Jesse Wilson            long intervalMillis, PendingIntent operation) {
196e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate        setImpl(type, triggerAtMillis, intervalMillis, operation, mAlwaysExact);
197e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    }
198e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate
199e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    /**
200e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     * TBW: new 'exact' alarm that must be delivered as nearly as possible
201e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     * to the precise time specified.
202e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     */
203e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    public void setExact(int type, long triggerAtMillis, PendingIntent operation) {
204e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate        setImpl(type, triggerAtMillis, 0, operation, true);
205e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    }
206e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate
207e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    private void setImpl(int type, long triggerAtMillis, long intervalMillis,
208e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate            PendingIntent operation, boolean isExact) {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
210e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate            mService.set(type, triggerAtMillis, intervalMillis, operation, isExact);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
216e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     * @deprecated setInexactRepeating() is deprecated; as of API 19 all
217e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     * repeating alarms are inexact.
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
219e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    @Deprecated
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final long INTERVAL_FIFTEEN_MINUTES = 15 * 60 * 1000;
221e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate
222e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    /**
223e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     * @deprecated setInexactRepeating() is deprecated; as of API 19 all
224e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     * repeating alarms are inexact.
225e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     */
226e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    @Deprecated
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final long INTERVAL_HALF_HOUR = 2*INTERVAL_FIFTEEN_MINUTES;
228e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate
229e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    /**
230e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     * @deprecated setInexactRepeating() is deprecated; as of API 19 all
231e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     * repeating alarms are inexact.
232e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     */
233e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    @Deprecated
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final long INTERVAL_HOUR = 2*INTERVAL_HALF_HOUR;
235e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate
236e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    /**
237e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     * @deprecated setInexactRepeating() is deprecated; as of API 19 all
238e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     * repeating alarms are inexact.
239e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     */
240e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    @Deprecated
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final long INTERVAL_HALF_DAY = 12*INTERVAL_HOUR;
242e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate
243e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    /**
244e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     * @deprecated setInexactRepeating() is deprecated; as of API 19 all
245e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     * repeating alarms are inexact.
246e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     */
247e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    @Deprecated
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final long INTERVAL_DAY = 2*INTERVAL_HALF_DAY;
249e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Schedule a repeating alarm that has inexact trigger time requirements;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for example, an alarm that repeats every hour, but not necessarily at
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the top of every hour.  These alarms are more power-efficient than
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the strict recurrences supplied by {@link #setRepeating}, since the
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system can adjust alarms' phase to cause them to fire simultaneously,
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * avoiding waking the device from sleep more than necessary.
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Your alarm's first trigger will not be before the requested time,
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * but it might not occur for almost a full interval after that time.  In
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * addition, while the overall period of the repeating alarm will be as
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * requested, the time between any two successive firings of the alarm
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * may vary.  If your application demands very low jitter, use
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setRepeating} instead.
26479074cd935854b497cb894046da13bb08a113982Jesse Wilson     *
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param type One of ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP}, RTC or
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *             RTC_WAKEUP.
26779074cd935854b497cb894046da13bb08a113982Jesse Wilson     * @param triggerAtMillis time in milliseconds that the alarm should first
26879074cd935854b497cb894046da13bb08a113982Jesse Wilson     * go off, using the appropriate clock (depending on the alarm type).  This
26979074cd935854b497cb894046da13bb08a113982Jesse Wilson     * is inexact: the alarm will not fire before this time, but there may be a
27079074cd935854b497cb894046da13bb08a113982Jesse Wilson     * delay of almost an entire alarm interval before the first invocation of
27179074cd935854b497cb894046da13bb08a113982Jesse Wilson     * the alarm.
27279074cd935854b497cb894046da13bb08a113982Jesse Wilson     * @param intervalMillis interval in milliseconds between subsequent repeats
27379074cd935854b497cb894046da13bb08a113982Jesse Wilson     * of the alarm.  If this is one of INTERVAL_FIFTEEN_MINUTES,
27479074cd935854b497cb894046da13bb08a113982Jesse Wilson     * INTERVAL_HALF_HOUR, INTERVAL_HOUR, INTERVAL_HALF_DAY, or INTERVAL_DAY
27579074cd935854b497cb894046da13bb08a113982Jesse Wilson     * then the alarm will be phase-aligned with other alarms to reduce the
27679074cd935854b497cb894046da13bb08a113982Jesse Wilson     * number of wakeups.  Otherwise, the alarm will be set as though the
27779074cd935854b497cb894046da13bb08a113982Jesse Wilson     * application had called {@link #setRepeating}.
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param operation Action to perform when the alarm goes off;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * typically comes from {@link PendingIntent#getBroadcast
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * IntentSender.getBroadcast()}.
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
282e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     * @deprecated As of API 19, all repeating alarms are inexact.
283e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate     *
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.os.Handler
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #set
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #cancel
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.content.Context#sendBroadcast
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.content.Context#registerReceiver
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.content.Intent#filterEquals
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ELAPSED_REALTIME
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ELAPSED_REALTIME_WAKEUP
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RTC
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #RTC_WAKEUP
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #INTERVAL_FIFTEEN_MINUTES
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #INTERVAL_HALF_HOUR
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #INTERVAL_HOUR
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #INTERVAL_HALF_DAY
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #INTERVAL_DAY
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
300e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate    @Deprecated
30179074cd935854b497cb894046da13bb08a113982Jesse Wilson    public void setInexactRepeating(int type, long triggerAtMillis,
30279074cd935854b497cb894046da13bb08a113982Jesse Wilson            long intervalMillis, PendingIntent operation) {
303e0a22b324d0e3157e570ea5f71cc682fa9696e01Christopher Tate        setRepeating(type, triggerAtMillis, intervalMillis, operation);
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove any alarms with a matching {@link Intent}.
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Any alarm, of any type, whose Intent matches this one (as defined by
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link Intent#filterEquals}), will be canceled.
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param operation IntentSender which matches a previously added
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * IntentSender.
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #set
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void cancel(PendingIntent operation) {
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService.remove(operation);
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32297e44947282b3918ee0bed2d16b33b983f882580Dan Egnor
32397e44947282b3918ee0bed2d16b33b983f882580Dan Egnor    /**
32497e44947282b3918ee0bed2d16b33b983f882580Dan Egnor     * Set the system wall clock time.
32597e44947282b3918ee0bed2d16b33b983f882580Dan Egnor     * Requires the permission android.permission.SET_TIME.
32697e44947282b3918ee0bed2d16b33b983f882580Dan Egnor     *
32797e44947282b3918ee0bed2d16b33b983f882580Dan Egnor     * @param millis time in milliseconds since the Epoch
32897e44947282b3918ee0bed2d16b33b983f882580Dan Egnor     */
32997e44947282b3918ee0bed2d16b33b983f882580Dan Egnor    public void setTime(long millis) {
33097e44947282b3918ee0bed2d16b33b983f882580Dan Egnor        try {
33197e44947282b3918ee0bed2d16b33b983f882580Dan Egnor            mService.setTime(millis);
33297e44947282b3918ee0bed2d16b33b983f882580Dan Egnor        } catch (RemoteException ex) {
33397e44947282b3918ee0bed2d16b33b983f882580Dan Egnor        }
33497e44947282b3918ee0bed2d16b33b983f882580Dan Egnor    }
33597e44947282b3918ee0bed2d16b33b983f882580Dan Egnor
33697e44947282b3918ee0bed2d16b33b983f882580Dan Egnor    /**
33797e44947282b3918ee0bed2d16b33b983f882580Dan Egnor     * Set the system default time zone.
33897e44947282b3918ee0bed2d16b33b983f882580Dan Egnor     * Requires the permission android.permission.SET_TIME_ZONE.
33997e44947282b3918ee0bed2d16b33b983f882580Dan Egnor     *
34097e44947282b3918ee0bed2d16b33b983f882580Dan Egnor     * @param timeZone in the format understood by {@link java.util.TimeZone}
34197e44947282b3918ee0bed2d16b33b983f882580Dan Egnor     */
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTimeZone(String timeZone) {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mService.setTimeZone(timeZone);
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException ex) {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
349