1、System.currentTimeMillis() 获取的是系统时间,也就是当前时刻与1970年1月1号0时0分0秒的差值,单位毫秒。可以使用 SystemClock.setCurrentTimeMillis(long millis) 进行设置。该时间可以被系统设置修改,通过监听 ACTION_TIME_TICK、ACTION_TIME_CHANGED 和 ACTION_TIMEZONE_CHANGED 这些广播 ACTION,来响应系统时间的变化。
2、SystemClock.uptimeMillis() 当前时刻与开机时刻的差值,不包括系统深度睡眠(CPU停止运行、屏幕息屏、等待外部输入),但是不会受到时钟缩放、时钟限制时间或其他节能机制的影响,单位毫秒。这个时钟是保证单调性,适用于计算同一个设备的时间间隔。
3、SystemClock.elapsedRealtime() 当前时刻与开机时刻的差值,它包含了深度睡眠时间。
几种控制机制:
(1)标准函数 Thread.sleep(millis) 和 Object.wait(millis) ,如果这两个函数使用 SystemClock.uptimeMillis() 时钟,当设备进入休眠状态时,提醒时间可能会被推迟到设备唤醒以后。并且这些同步函数可以被 Thread.interrupt() 打断。
(2)SystemClock.sleep(millis) 是一个工具函数,类似于 Thread.sleep(millis),不同的是它忽略了 InterruptedException 异常,如果你用不到 Thread.interrupt() 的话,就可以使用这个函数来延迟。
(3)Handler 可以在一个绝对或者相对的时间里同步的调度 Runnable 对象,它可以使用 SystemClock.uptimeMillis() 时钟。
(4)AlarmManager 可以设置一个定时器事件,当时间到来的时候,不管设备是否处于深度睡眠或者正在运行,事件都会发生。