0%

currentTimeMillis() 与 elapsedRealtime() 的区别

在做安卓定时功能时,常会对currentTimeMillis() 与 elapsedRealtime() 获取的当前时间毫秒产生疑问

currentTimeMillis()

1
System.currentTimeMillis() ;

获取到的是一个标准的“墙”时钟(时间和日期),表示从纪元到现在的毫秒数。也就是从1970年1月1日到现在所经历的毫秒数。

elapsedRealtime()

1
SystemClock.elapsedRealtime();

获取到 系统启动到现在的时间,包含设备深度休眠的时间。该时钟被保证是单调的,即使CPU在省电模式下,该时间也会继续计时。该时钟可以被使用在当测量时间间隔可能跨越系统睡眠的时间段。

AlarmManager 定时针对以上两种计时标准

AlarmManager 设置定时的方法针对 android 不同版本 有不同的 set 函数。

1
2
3
4
5
6
7
8
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// 6.0
alarmManager.setExactAndAllowWhileIdle(...);

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {// 4.4
alarmManager.setExact(...);
} else {
alarmManager.set(...);
}

以下统一用 set函数 来说明

使用 currentTimeMillis()计时

需要 set()中的 type 使用

1
2
3
AlarmManager.RTC_WAKEUP
// 或
AlarmManager.RTC

使用 elapsedRealtime()计时

需要 set()中的 type 使用

1
2
3
AlarmManager.ELAPSED_REALTIME_WAKEUP
// 或
AlarmManager.ELAPSED_REALTIME

总结

计时的标准选择并不是绝对的,根据实际开发情况,选择合适恰当的计时标准。