1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.os;
18 
19 import android.app.IAlarmManager;
20 import android.content.Context;
21 import android.util.Slog;
22 
23 /**
24  * Core timekeeping facilities.
25  *
26  * <p> Three different clocks are available, and they should not be confused:
27  *
28  * <ul>
29  *     <li> <p> {@link System#currentTimeMillis System.currentTimeMillis()}
30  *     is the standard "wall" clock (time and date) expressing milliseconds
31  *     since the epoch.  The wall clock can be set by the user or the phone
32  *     network (see {@link #setCurrentTimeMillis}), so the time may jump
33  *     backwards or forwards unpredictably.  This clock should only be used
34  *     when correspondence with real-world dates and times is important, such
35  *     as in a calendar or alarm clock application.  Interval or elapsed
36  *     time measurements should use a different clock.  If you are using
37  *     System.currentTimeMillis(), consider listening to the
38  *     {@link android.content.Intent#ACTION_TIME_TICK ACTION_TIME_TICK},
39  *     {@link android.content.Intent#ACTION_TIME_CHANGED ACTION_TIME_CHANGED}
40  *     and {@link android.content.Intent#ACTION_TIMEZONE_CHANGED
41  *     ACTION_TIMEZONE_CHANGED} {@link android.content.Intent Intent}
42  *     broadcasts to find out when the time changes.
43  *
44  *     <li> <p> {@link #uptimeMillis} is counted in milliseconds since the
45  *     system was booted.  This clock stops when the system enters deep
46  *     sleep (CPU off, display dark, device waiting for external input),
47  *     but is not affected by clock scaling, idle, or other power saving
48  *     mechanisms.  This is the basis for most interval timing
49  *     such as {@link Thread#sleep(long) Thread.sleep(millls)},
50  *     {@link Object#wait(long) Object.wait(millis)}, and
51  *     {@link System#nanoTime System.nanoTime()}.  This clock is guaranteed
52  *     to be monotonic, and is suitable for interval timing when the
53  *     interval does not span device sleep.  Most methods that accept a
54  *     timestamp value currently expect the {@link #uptimeMillis} clock.
55  *
56  *     <li> <p> {@link #elapsedRealtime} and {@link #elapsedRealtimeNanos}
57  *     return the time since the system was booted, and include deep sleep.
58  *     This clock is guaranteed to be monotonic, and continues to tick even
59  *     when the CPU is in power saving modes, so is the recommend basis
60  *     for general purpose interval timing.
61  *
62  * </ul>
63  *
64  * There are several mechanisms for controlling the timing of events:
65  *
66  * <ul>
67  *     <li> <p> Standard functions like {@link Thread#sleep(long)
68  *     Thread.sleep(millis)} and {@link Object#wait(long) Object.wait(millis)}
69  *     are always available.  These functions use the {@link #uptimeMillis}
70  *     clock; if the device enters sleep, the remainder of the time will be
71  *     postponed until the device wakes up.  These synchronous functions may
72  *     be interrupted with {@link Thread#interrupt Thread.interrupt()}, and
73  *     you must handle {@link InterruptedException}.
74  *
75  *     <li> <p> {@link #sleep SystemClock.sleep(millis)} is a utility function
76  *     very similar to {@link Thread#sleep(long) Thread.sleep(millis)}, but it
77  *     ignores {@link InterruptedException}.  Use this function for delays if
78  *     you do not use {@link Thread#interrupt Thread.interrupt()}, as it will
79  *     preserve the interrupted state of the thread.
80  *
81  *     <li> <p> The {@link android.os.Handler} class can schedule asynchronous
82  *     callbacks at an absolute or relative time.  Handler objects also use the
83  *     {@link #uptimeMillis} clock, and require an {@link android.os.Looper
84  *     event loop} (normally present in any GUI application).
85  *
86  *     <li> <p> The {@link android.app.AlarmManager} can trigger one-time or
87  *     recurring events which occur even when the device is in deep sleep
88  *     or your application is not running.  Events may be scheduled with your
89  *     choice of {@link java.lang.System#currentTimeMillis} (RTC) or
90  *     {@link #elapsedRealtime} (ELAPSED_REALTIME), and cause an
91  *     {@link android.content.Intent} broadcast when they occur.
92  * </ul>
93  */
94 public final class SystemClock {
95     private static final String TAG = "SystemClock";
96 
97     /**
98      * This class is uninstantiable.
99      */
SystemClock()100     private SystemClock() {
101         // This space intentionally left blank.
102     }
103 
104     /**
105      * Waits a given number of milliseconds (of uptimeMillis) before returning.
106      * Similar to {@link java.lang.Thread#sleep(long)}, but does not throw
107      * {@link InterruptedException}; {@link Thread#interrupt()} events are
108      * deferred until the next interruptible operation.  Does not return until
109      * at least the specified number of milliseconds has elapsed.
110      *
111      * @param ms to sleep before returning, in milliseconds of uptime.
112      */
sleep(long ms)113     public static void sleep(long ms)
114     {
115         long start = uptimeMillis();
116         long duration = ms;
117         boolean interrupted = false;
118         do {
119             try {
120                 Thread.sleep(duration);
121             }
122             catch (InterruptedException e) {
123                 interrupted = true;
124             }
125             duration = start + ms - uptimeMillis();
126         } while (duration > 0);
127 
128         if (interrupted) {
129             // Important: we don't want to quietly eat an interrupt() event,
130             // so we make sure to re-interrupt the thread so that the next
131             // call to Thread.sleep() or Object.wait() will be interrupted.
132             Thread.currentThread().interrupt();
133         }
134     }
135 
136     /**
137      * Sets the current wall time, in milliseconds.  Requires the calling
138      * process to have appropriate permissions.
139      *
140      * @return if the clock was successfully set to the specified time.
141      */
setCurrentTimeMillis(long millis)142     public static boolean setCurrentTimeMillis(long millis) {
143         IBinder b = ServiceManager.getService(Context.ALARM_SERVICE);
144         IAlarmManager mgr = IAlarmManager.Stub.asInterface(b);
145         if (mgr == null) {
146             return false;
147         }
148 
149         try {
150             return mgr.setTime(millis);
151         } catch (RemoteException e) {
152             Slog.e(TAG, "Unable to set RTC", e);
153         } catch (SecurityException e) {
154             Slog.e(TAG, "Unable to set RTC", e);
155         }
156 
157         return false;
158     }
159 
160     /**
161      * Returns milliseconds since boot, not counting time spent in deep sleep.
162      *
163      * @return milliseconds of non-sleep uptime since boot.
164      */
uptimeMillis()165     native public static long uptimeMillis();
166 
167     /**
168      * Returns milliseconds since boot, including time spent in sleep.
169      *
170      * @return elapsed milliseconds since boot.
171      */
elapsedRealtime()172     native public static long elapsedRealtime();
173 
174     /**
175      * Returns nanoseconds since boot, including time spent in sleep.
176      *
177      * @return elapsed nanoseconds since boot.
178      */
elapsedRealtimeNanos()179     public static native long elapsedRealtimeNanos();
180 
181     /**
182      * Returns milliseconds running in the current thread.
183      *
184      * @return elapsed milliseconds in the thread
185      */
currentThreadTimeMillis()186     public static native long currentThreadTimeMillis();
187 
188     /**
189      * Returns microseconds running in the current thread.
190      *
191      * @return elapsed microseconds in the thread
192      *
193      * @hide
194      */
currentThreadTimeMicro()195     public static native long currentThreadTimeMicro();
196 
197     /**
198      * Returns current wall time in  microseconds.
199      *
200      * @return elapsed microseconds in wall time
201      *
202      * @hide
203      */
currentTimeMicro()204     public static native long currentTimeMicro();
205 }
206