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 1938bf51466881b726f42832743d8cca6ee67bb148Greg Hackmannimport android.app.IAlarmManager; 2038bf51466881b726f42832743d8cca6ee67bb148Greg Hackmannimport android.content.Context; 2138bf51466881b726f42832743d8cca6ee67bb148Greg Hackmannimport android.util.Slog; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Core timekeeping facilities. 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> Three different clocks are available, and they should not be confused: 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p> {@link System#currentTimeMillis System.currentTimeMillis()} 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is the standard "wall" clock (time and date) expressing milliseconds 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * since the epoch. The wall clock can be set by the user or the phone 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network (see {@link #setCurrentTimeMillis}), so the time may jump 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * backwards or forwards unpredictably. This clock should only be used 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when correspondence with real-world dates and times is important, such 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as in a calendar or alarm clock application. Interval or elapsed 3637296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato * time measurements should use a different clock. If you are using 3737296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato * System.currentTimeMillis(), consider listening to the 3837296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato * {@link android.content.Intent#ACTION_TIME_TICK ACTION_TIME_TICK}, 3937296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato * {@link android.content.Intent#ACTION_TIME_CHANGED ACTION_TIME_CHANGED} 4037296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato * and {@link android.content.Intent#ACTION_TIMEZONE_CHANGED 4137296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato * ACTION_TIMEZONE_CHANGED} {@link android.content.Intent Intent} 4237296dc4edae8d1383179e956dff2ecf806ac166Joe Onorato * broadcasts to find out when the time changes. 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p> {@link #uptimeMillis} is counted in milliseconds since the 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system was booted. This clock stops when the system enters deep 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sleep (CPU off, display dark, device waiting for external input), 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but is not affected by clock scaling, idle, or other power saving 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mechanisms. This is the basis for most interval timing 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * such as {@link Thread#sleep(long) Thread.sleep(millls)}, 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Object#wait(long) Object.wait(millis)}, and 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link System#nanoTime System.nanoTime()}. This clock is guaranteed 5295f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * to be monotonic, and is suitable for interval timing when the 5395f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * interval does not span device sleep. Most methods that accept a 5495f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * timestamp value currently expect the {@link #uptimeMillis} clock. 5595f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * 564118012da9a22694b3353040a485f8cdc27e2f17Philip Milne * <li> <p> {@link #elapsedRealtime} and {@link #elapsedRealtimeNanos} 5795f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * return the time since the system was booted, and include deep sleep. 5895f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * This clock is guaranteed to be monotonic, and continues to tick even 5995f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * when the CPU is in power saving modes, so is the recommend basis 6095f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * for general purpose interval timing. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There are several mechanisms for controlling the timing of events: 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p> Standard functions like {@link Thread#sleep(long) 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Thread.sleep(millis)} and {@link Object#wait(long) Object.wait(millis)} 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are always available. These functions use the {@link #uptimeMillis} 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clock; if the device enters sleep, the remainder of the time will be 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * postponed until the device wakes up. These synchronous functions may 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be interrupted with {@link Thread#interrupt Thread.interrupt()}, and 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you must handle {@link InterruptedException}. 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p> {@link #sleep SystemClock.sleep(millis)} is a utility function 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * very similar to {@link Thread#sleep(long) Thread.sleep(millis)}, but it 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ignores {@link InterruptedException}. Use this function for delays if 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you do not use {@link Thread#interrupt Thread.interrupt()}, as it will 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * preserve the interrupted state of the thread. 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p> The {@link android.os.Handler} class can schedule asynchronous 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * callbacks at an absolute or relative time. Handler objects also use the 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #uptimeMillis} clock, and require an {@link android.os.Looper 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * event loop} (normally present in any GUI application). 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <p> The {@link android.app.AlarmManager} can trigger one-time or 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recurring events which occur even when the device is in deep sleep 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or your application is not running. Events may be scheduled with your 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * choice of {@link java.lang.System#currentTimeMillis} (RTC) or 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #elapsedRealtime} (ELAPSED_REALTIME), and cause an 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent} broadcast when they occur. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class SystemClock { 9538bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann private static final String TAG = "SystemClock"; 9638bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is uninstantiable. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SystemClock() { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This space intentionally left blank. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Waits a given number of milliseconds (of uptimeMillis) before returning. 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Similar to {@link java.lang.Thread#sleep(long)}, but does not throw 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link InterruptedException}; {@link Thread#interrupt()} events are 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * deferred until the next interruptible operation. Does not return until 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * at least the specified number of milliseconds has elapsed. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ms to sleep before returning, in milliseconds of uptime. 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void sleep(long ms) 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long start = uptimeMillis(); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long duration = ms; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean interrupted = false; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread.sleep(duration); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (InterruptedException e) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project interrupted = true; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project duration = start + ms - uptimeMillis(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (duration > 0); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (interrupted) { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Important: we don't want to quietly eat an interrupt() event, 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so we make sure to re-interrupt the thread so that the next 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // call to Thread.sleep() or Object.wait() will be interrupted. 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread.currentThread().interrupt(); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the current wall time, in milliseconds. Requires the calling 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * process to have appropriate permissions. 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return if the clock was successfully set to the specified time. 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14238bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann public static boolean setCurrentTimeMillis(long millis) { 14338bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann IBinder b = ServiceManager.getService(Context.ALARM_SERVICE); 14438bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann IAlarmManager mgr = IAlarmManager.Stub.asInterface(b); 14538bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann if (mgr == null) { 14638bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann return false; 14738bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann } 14838bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann 14938bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann try { 15038bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann return mgr.setTime(millis); 15138bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann } catch (RemoteException e) { 15238bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann Slog.e(TAG, "Unable to set RTC", e); 15338bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann } catch (SecurityException e) { 15438bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann Slog.e(TAG, "Unable to set RTC", e); 15538bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann } 15638bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann 15738bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann return false; 15838bf51466881b726f42832743d8cca6ee67bb148Greg Hackmann } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns milliseconds since boot, not counting time spent in deep sleep. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return milliseconds of non-sleep uptime since boot. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native public static long uptimeMillis(); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns milliseconds since boot, including time spent in sleep. 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return elapsed milliseconds since boot. 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project native public static long elapsedRealtime(); 17395f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly 17495f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly /** 17595f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * Returns nanoseconds since boot, including time spent in sleep. 17695f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * 17795f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * @return elapsed nanoseconds since boot. 17895f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly */ 1794118012da9a22694b3353040a485f8cdc27e2f17Philip Milne public static native long elapsedRealtimeNanos(); 18095f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns milliseconds running in the current thread. 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return elapsed milliseconds in the thread 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static native long currentThreadTimeMillis(); 187648bee18a1ccd362445d562729250ff5910f16a0Romain Guy 188648bee18a1ccd362445d562729250ff5910f16a0Romain Guy /** 189648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * Returns microseconds running in the current thread. 190648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * 191648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * @return elapsed microseconds in the thread 192648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * 193648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * @hide 194648bee18a1ccd362445d562729250ff5910f16a0Romain Guy */ 195648bee18a1ccd362445d562729250ff5910f16a0Romain Guy public static native long currentThreadTimeMicro(); 196648bee18a1ccd362445d562729250ff5910f16a0Romain Guy 197648bee18a1ccd362445d562729250ff5910f16a0Romain Guy /** 198648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * Returns current wall time in microseconds. 199648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * 200648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * @return elapsed microseconds in wall time 201648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * 202648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * @hide 203648bee18a1ccd362445d562729250ff5910f16a0Romain Guy */ 204648bee18a1ccd362445d562729250ff5910f16a0Romain Guy public static native long currentTimeMicro(); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 206