19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 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.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Core timekeeping facilities.
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> Three different clocks are available, and they should not be confused:
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p> {@link System#currentTimeMillis System.currentTimeMillis()}
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     is the standard "wall" clock (time and date) expressing milliseconds
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     since the epoch.  The wall clock can be set by the user or the phone
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     network (see {@link #setCurrentTimeMillis}), so the time may jump
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     backwards or forwards unpredictably.  This clock should only be used
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     when correspondence with real-world dates and times is important, such
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     as in a calendar or alarm clock application.  Interval or elapsed
3337296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     time measurements should use a different clock.  If you are using
3437296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     System.currentTimeMillis(), consider listening to the
3537296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     {@link android.content.Intent#ACTION_TIME_TICK ACTION_TIME_TICK},
3637296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     {@link android.content.Intent#ACTION_TIME_CHANGED ACTION_TIME_CHANGED}
3737296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     and {@link android.content.Intent#ACTION_TIMEZONE_CHANGED
3837296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     ACTION_TIMEZONE_CHANGED} {@link android.content.Intent Intent}
3937296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato *     broadcasts to find out when the time changes.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p> {@link #uptimeMillis} is counted in milliseconds since the
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     system was booted.  This clock stops when the system enters deep
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     sleep (CPU off, display dark, device waiting for external input),
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     but is not affected by clock scaling, idle, or other power saving
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     mechanisms.  This is the basis for most interval timing
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     such as {@link Thread#sleep(long) Thread.sleep(millls)},
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link Object#wait(long) Object.wait(millis)}, and
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link System#nanoTime System.nanoTime()}.  This clock is guaranteed
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     to be monotonic, and is the recommended basis for the general purpose
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     interval timing of user interface events, performance measurements,
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     and anything else that does not need to measure elapsed time during
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     device sleep.  Most methods that accept a timestamp value expect the
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link #uptimeMillis} clock.
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p> {@link #elapsedRealtime} is counted in milliseconds since the
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     system was booted, including deep sleep.  This clock should be used
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     when measuring time intervals that may span periods of system sleep.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There are several mechanisms for controlling the timing of events:
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p> Standard functions like {@link Thread#sleep(long)
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     Thread.sleep(millis)} and {@link Object#wait(long) Object.wait(millis)}
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     are always available.  These functions use the {@link #uptimeMillis}
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     clock; if the device enters sleep, the remainder of the time will be
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     postponed until the device wakes up.  These synchronous functions may
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     be interrupted with {@link Thread#interrupt Thread.interrupt()}, and
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     you must handle {@link InterruptedException}.
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p> {@link #sleep SystemClock.sleep(millis)} is a utility function
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     very similar to {@link Thread#sleep(long) Thread.sleep(millis)}, but it
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     ignores {@link InterruptedException}.  Use this function for delays if
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     you do not use {@link Thread#interrupt Thread.interrupt()}, as it will
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     preserve the interrupted state of the thread.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p> The {@link android.os.Handler} class can schedule asynchronous
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     callbacks at an absolute or relative time.  Handler objects also use the
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link #uptimeMillis} clock, and require an {@link android.os.Looper
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     event loop} (normally present in any GUI application).
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <li> <p> The {@link android.app.AlarmManager} can trigger one-time or
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     recurring events which occur even when the device is in deep sleep
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     or your application is not running.  Events may be scheduled with your
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     choice of {@link java.lang.System#currentTimeMillis} (RTC) or
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link #elapsedRealtime} (ELAPSED_REALTIME), and cause an
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     {@link android.content.Intent} broadcast when they occur.
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class SystemClock {
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This class is uninstantiable.
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SystemClock() {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This space intentionally left blank.
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Waits a given number of milliseconds (of uptimeMillis) before returning.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Similar to {@link java.lang.Thread#sleep(long)}, but does not throw
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link InterruptedException}; {@link Thread#interrupt()} events are
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * deferred until the next interruptible operation.  Does not return until
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at least the specified number of milliseconds has elapsed.
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param ms to sleep before returning, in milliseconds of uptime.
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void sleep(long ms)
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long start = uptimeMillis();
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long duration = ms;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean interrupted = false;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        do {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Thread.sleep(duration);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            catch (InterruptedException e) {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                interrupted = true;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            duration = start + ms - uptimeMillis();
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } while (duration > 0);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (interrupted) {
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Important: we don't want to quietly eat an interrupt() event,
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // so we make sure to re-interrupt the thread so that the next
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // call to Thread.sleep() or Object.wait() will be interrupted.
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Thread.currentThread().interrupt();
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the current wall time, in milliseconds.  Requires the calling
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process to have appropriate permissions.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return if the clock was successfully set to the specified time.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native public static boolean setCurrentTimeMillis(long millis);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns milliseconds since boot, not counting time spent in deep sleep.
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <b>Note:</b> This value may get reset occasionally (before it would
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * otherwise wrap around).
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return milliseconds of non-sleep uptime since boot.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native public static long uptimeMillis();
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns milliseconds since boot, including time spent in sleep.
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return elapsed milliseconds since boot.
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    native public static long elapsedRealtime();
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns milliseconds running in the current thread.
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return elapsed milliseconds in the thread
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static native long currentThreadTimeMillis();
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
161