Android开发之获取手机运行时间

前言

昨天我碰到一个问题,须要判断两次的时间,我当时的第一反应是用System.currentTimeMillis()来判断,最后发现这样会有一个BUG,那就是用户若是手动修改时间,那就全乱套了,因而我想有没有一个时间是只增长不减小,而且用户是不能修改的?一查,发现还真有,主要和SystemClock有关,接下来对这个类进行学习。网络

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() 和elapsedRealtimeNanos() 返回系统启动到如今的时间,包含设备深度休眠的时间。该时钟被确保单调,即便CPU在省电模式下,该时间也会继续计时。该时钟能够被使用在测量时间间隔时系统可能睡眠的时间段。oop

这有一些机制为了控制定时事件的:学习

  1. 标准的功能Thread.sleep(millis)Object.wait(millis)都老是合适的。这是功能使用uptimeMillis()时钟;若是该设备进入睡眠,剩余的时间将被推迟直到系统唤醒。这些同步功能可能被中断伴随Thread.interrupt()方法,而且你必须处理InterruptedException异常。spa

  2. SystemClock.sleep(millis)是一种实用工具函数变化相似于Thread.sleep(millis),可是它忽视了InterruptedException异常。使用该函数产生的延迟若是你不使用Thread.interrupt(),由于它会保存线程的中断状态。线程

  3. 处理程序类能够安排在绝对或相对时间异步回调。处理器类对象也使用uptimeMillis()时钟,而且须要一个eventloop(正常呈如今任何一个GUI应用程序上)。该AlarmManager能够触发一次或重复事件去发生即便在深睡眠或你的应用程序没有运行。事件可能有计划的发生伴随你的currentTimeMillis()(RTC)机会或elapsedRealtime()(ELAPSED_REALTIME),而且引发一个意图广播当它们发生时。对象

有几种机制能够控制事件发生的时间:进程

  1. 对标准的方法好比Thread.sleep(millis) 和Object.wait(millis)都是有效的,这些方法使用的是uptimeMillis()时钟,若是设备进入深度休眠,剩余的时间将被推迟直到系统唤醒。这些同步方法可能被Thread.interrupt()中断,你必须处理InterruptedException异常。

  2. SystemClock.sleep(millis)是一个相似于Thread.sleep(millis)的实用方法,可是它忽略InterruptedException异常(其实就是使用Thread.sleep,不过对异常进行了处理)。使用该函数会产生延迟,若是你不使用Thread.interrupt(),由于它会保存线程的中断状态。

  3. Handler类能够在一个相对或者绝对的时间设置异步回调,Handler对象也使用uptimeMillis()时钟,并且须要一个loop(常常出如今GUI程序中)。

  4. AlarmManager能够触发一次或重复事件,即便设备深度休眠或者应用程序没有运行。事件能够选择用currentTimeMillis()(RTC)或者elapsedRealtime()(ELAPSED_REALTIME)来设置时间,当事件发生会触发一个Intent广播。

  5. public方法:

static long currentThreadTimeMillis() 返在当前线程运行的毫秒数。

static long elapsedRealtime() 返回系统启动到如今的毫秒数,包含休眠时间。

static long elapsedRealtimeNanos() 返回系统启动到如今的纳秒数,包含休眠时间。

static boolean setCurrentTimeMillis(long millis) 设置当前挂钟时间,以毫秒为单位。须要调用进程具备相应的权限。

static void sleep(long ms) 等待给定的时间(uptimeMillis)。和Thread.sleep(millis)相似,可是它不会抛出InterruptedException异常。事件被推迟到下一个中断操做。该方法直到指定的时间过去才返回。

static long uptimeMillis() 返回系统启动到如今的毫秒级时间,不包含休眠时间。(系统启动到如今的非休眠期时间)

相关文章
相关标签/搜索