1、两种时间的区别:
- 1、System.currentTimeMillis()获取的是系统的时间,可以使用SystemClock.setCurrentTimeMillis(long millis)进行设置。如果使用System.currentTimeMillis()来获取当前时间进行计时,应该考虑监听ACTION_TIME_TICK, ACTION_TIME_CHANGED 和 ACTION_TIMEZONE_CHANGED这些广播ACTION,如果系统时间发生了改变,可以通过监听广播来获取。
- 2、SystemClock.uptimeMillis()表示系统开机到当前的时间总数,单位是毫秒,但是,当系统进入深度睡眠(CPU休眠、屏幕休眠、设备等待外部输入)时间就会停止,但是不会受到时钟缩放、空闲或者其他节能机制的影响。
- 3、SystemClock.elapsedRealtime()和SystemClock.elapsedRealtimeNanos()表示系统开机到当前的时间总数。它包括了系统深度睡眠的时间。这个时钟是单调的,它保证一直计时,即使CPU处于省电模式,所以它是推荐使用的时间计时器。
2、有几种机制,用来控制事件时间:
- 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可以设置一个定时器事件,当时间到来的时候,不管设备是否处于深度睡眠或者正在运行,事件都会发生。