類的概述
核心計時設施。
三種不同的時鐘是適合的,並且他們不應該被混淆:
System.currentTimeMillis()是一個標準的“牆”時鐘(時間和日期)表達毫秒自紀元。該牆時鐘能夠被用戶或電話網絡(見setCurrentTimeMillis(long))設置,所以時間可能會向前或向後不可預知地跳。該時鐘應該僅僅被使用,當現實世界的對應的日期和時間是重要的,例如在一個日曆或鬧鐘應用程序。間隔的或經過的時間測量應該使用一個不同的時鐘。如果你使用System.currentTimeMillis(),考慮監聽 ACTION_TIME_TICK
,ACTION_TIME_CHANGED
和 ACTION_TIMEZONE_CHANGED
意圖廣播去發現當時間變化的時候。
uptimeMillis()以毫秒爲單位進行計數自系統啓動時。該時鐘停止當系統進入深度睡眠時(CPU關閉,顯示黑暗,等待外部輸入裝置),但是不被時鐘調整,閒置或其他節能機制影響。 這是基本的對於大多數時間間隔例如Thread.sleep(millls)
,
Object.wait(millis)
,和 System.nanoTime()
。
該時鐘被保證是單調的,並且是爲通用的用戶界面事件,性能測量,和其他任何不需要在器件測量經過睡眠時間間隔時間的建議的基礎。大多數的方法接受一個時間戳的值除了uptimeMillis()時鐘。
elapsedRealtime()以毫秒爲單位進行計數自動系統啓動,包含深度睡眠。該時鐘應該被使用當測量時間間隔可能跨越系統睡眠的時間段。
這有一些機制爲了控制定時事件的:
標準的功能像 Thread.sleep(millis)
和 Object.wait(millis)
都總是合適的。這是功能使用uptimeMillis()時鐘;如果該設備進入睡眠,剩餘的時間將被推遲直到系統喚醒。這些同步功能可能被中斷伴隨 Thread.interrupt()
方法,並且你必須處理InterruptedException異常。
SystemClock.sleep(millis) 是一種實用工具函數變化類似於Thread.sleep(millis)
,
但是它忽視了InterruptedException異常。使用該函數產生的延遲如果你不使用Thread.interrupt(),因爲它會保存線程的中斷狀態。
處理程序類可以安排在絕對或相對時間異步回調。處理器類對象也使用 uptimeMillis()
時鐘,並且需要一個event
loop(正常呈現在任何一個GUI應用程序上)。該AlarmManager可以觸發一次或重複事件去發生即使在深睡眠或你的應用程序沒有運行。事件可能有計劃的發生伴隨你的 currentTimeMillis()(RTC)
機會或 elapsedRealtime()
(ELAPSED_REALTIME),並且引起一個意圖廣播當它們發生時。