一、声明:
public final class SystemClock extends Object 是一个不可变类。 二、结构:java.lang.Object | |
? | android.os.SystemClock |
1、System.currentTimeMillis()是一个标准的“墙”时钟(时间和日期),表示从纪元到现在的毫秒数。该墙时钟能够被用户或电话网络(见setCurrentTimeMillis(long))设置,所以该时间可能会向前或向后不可预知地跳越。该时钟应该仅仅被使用在当现实世界的对应的日期和时间是重要的情况,例如一个日历或闹钟应用程序。而间隔时间和经过时间应该使用不同的时钟。如果你使用System.currentTimeMillis(),可以考虑监听ACTION为ACTION_TIME_TICK、ACTION_TIME_CHANGED、ACTION_TIMEZONE_CHANGED
的广播去监听时间变化。
2、uptimeMillis()表示自系统启动时开始计数,以毫秒为单位。返回的是从系统启动到现在这个过程中的处于非休眠期的时间。当系统进入深度睡眠时(CPU关闭,设备变黑,等待外部输入装置)该时钟会停止。但是该时钟不会被时钟调整,闲置或其他节能机所影响。这是大多数间隔时间的基本点,例如Thread.sleep(millls)
、Object.wait(millis)
和System.nanoTime()
。该时钟被保证是单调的,适用于检测不包含休眠的间隔时间的情况。大多数的方法接受一个时间戳的值除了uptimeMillis()时钟。
3、elapsedRealtime() and
elapsedRealtimeNanos() 返回系统启动到现在的时间,包含设备深度休眠的时间。该时钟被保证是单调的,即使CPU在省电模式下,该时间也会继续计时。该时钟可以被使用在当测量时间间隔可能跨越系统睡眠的时间段。
三种不同的时钟是适合的,并且他们不应该被混淆:
System.currentTimeMillis()是一个标准的“墙”时钟(时间和日期)表达毫秒自纪元。该墙时钟能够被用户或电话网络(见setCurrentTimeMillis(long))设置,所以时间可能会向前或向后不可预知地跳。该时钟应该仅仅被使用,当现实世界的对应的日期和时间是重要的,例如在一个日历或闹钟应用程序。间隔的或经过的时间测量应该使用一个不同的时钟。如果你使用System.currentTimeMillis(),考虑监听<wbr></wbr>ACTION_TIME_TICK
,ACTION_TIME_CHANGED
<wbr></wbr>和<wbr></wbr>ACTION_TIMEZONE_CHANGED
意图广播去发现当时间变化的时候。
uptimeMillis()以毫秒为单位进行计数自系统启动时,返回的是系统从启动到当前处于非休眠期的时间。该时钟停止当系统进入深度睡眠时(CPU关闭,显示黑暗,等待外部输入装置),但是不被时钟调整,闲置或其他节能机制影响。<wbr></wbr>这是基本的对于大多数时间间隔例如Thread.sleep(millls)
,
Object.wait(millis)
,和<wbr></wbr>System.nanoTime()
。
该时钟被保证是单调的,并且是为通用的用户界面事件,性能测量,和其他任何不需要在器件测量经过睡眠时间间隔时间的建议的基础。大多数的方法接受一个时间戳的值除了uptimeMillis()时钟。
elapsedRealtime()以毫秒为单位进行计数自动系统启动,包含深度睡眠。该时钟应该被使用当测量时间间隔可能跨越系统睡眠的时间段。
这有一些机制为了控制定时事件的:
标准的功能像<wbr></wbr>Thread.sleep(millis)
<wbr></wbr>和<wbr></wbr>Object.wait(millis)
<wbr></wbr>都总是合适的。这是功能使用uptimeMillis()时钟;如果该设备进入睡眠,剩余的时间将被推迟直到系统唤醒。这些同步功能可能被中断伴随<wbr></wbr>Thread.interrupt()
方法,并且你必须处理InterruptedException异常。
SystemClock.sleep(millis)<wbr></wbr>是一种实用工具函数变化类似于Thread.sleep(millis)
,
但是它忽视了InterruptedException异常。使用该函数产生的延迟如果你不使用Thread.interrupt(),因为它会保存线程的中断状态。
处理程序类可以安排在绝对或相对时间异步回调。处理器类对象也使用<wbr></wbr>uptimeMillis()
时钟,并且需要一个eventloop(正常呈现在任何一个GUI应用程序上)。该AlarmManager可以触发一次或重复事件去发生即使在深睡眠或你的应用程序没有运行。事件可能有计划的发生伴随你的<wbr></wbr>currentTimeMillis()(RTC)
机会或<wbr></wbr>elapsedRealtime()
<wbr></wbr>(ELAPSED_REALTIME),并且引起一个意图广播当它们发生时。
有几种机制控制事件发生的时间:
1、标准的方法像Thread.sleep(millis)
和Object.wait(millis)总是可用的,这些方法使用的是uptimeMillis()时钟,如果设备进入深度休眠,剩余的时间将被推迟直到系统唤醒。这些同步方法可能被Thread.interrupt()中断,并且你必须处理InterruptedException异常。
2、SystemClock.sleep(millis)是一个类似于Thread.sleep(millis)的实用方法,但是它忽略InterruptedException异常。使用该函数产生的延迟如果你不使用Thread.interrupt(),因为它会保存线程的中断状态。
3、Handler可以在一个相对或者绝对的时间设置异步回调,Handler类对象也使用uptimeMillis()时钟,而且需要一个loop(经常出现在GUI程序中)。
4、AlarmManager可以触发一次或重复事件,即使设备深度休眠或者应用程序没有运行。事件可以选择用currentTimeMillis或者elapsedRealtime()(ELAPSED_REALTIME)来设置时间,当事件发生会触发一个广播。
四、方法:
1、public static long currentThreadTimeMillis() 返在当前线程运行的毫秒数。
2、public static long elapsedRealtime() 返回系统启动到现在的毫秒数,包含休眠时间。
3、public static long elapsedRealtimeNanos() 返回系统启动到现在的纳秒数,包含休眠时间。
4、public static boolean setCurrentTimeMillis(long millis) 设置当前的"墙"时间,要求调用进程有许可权限。返回是否成功。
5、public static void sleep(long ms) 等待给定的时间。和Thread.sleep(millis)类似,但是它不会抛出InterruptedException异常。事件被推迟到下一个中断操作。该方法直到指定的时间过去才返回。
6、public static long uptimeMillis() 返回系统启动到现在的毫秒数,不包含休眠时间。就是说统计系统启动到现在的非休眠期时间。