【问题标题】:Know if uptime timer is reset or Android has been rebooted了解正常运行时间计时器是否已重置或 Android 是否已重新启动
【发布时间】:2013-04-27 18:00:56
【问题描述】:

我在我的应用程序中创建了一个独立的时钟。时钟作为活动中的不同线程运行,从我设置的基本时间开始。我使用设置时钟时的 uptimemillis 和当前 uptimemillis 之间的差异来更新时钟。但 uptimer 可以由 Android 重置,并且在 Android 重启时会重置。

我只想知道正常运行时间计时器是否已重置,以了解时钟是否仍然可靠。

怎么做?

【问题讨论】:

  • uptimeMillis()long。它可以在环绕之前处理 9,223,372,036,854,775,807 毫秒。那是一段相当长的时间,所以除非你有证据表明它在那之前显着环绕,否则我不会担心这个问题。如果你确实有这样的证据,我很乐意看到。
  • 也许您应该只使用实时时钟来获取绝对时间,而不是使用系统正常运行时间?如:new Date()
  • @CommonsWare 我读过Android可以出于内部原因重置它......但是正常运行时间计时器在重启时重置。因此,我该如何“解决”这个问题?
  • “但是正常运行时间计时器在重新启动时被重置”——正确。 “因此,我该如何“解决”这个问题?” -- 停止使用uptimeMillis(),因为您假设它的含义不是自上次重新启动以来的毫秒数。 “如果我使用实时时钟,如果用户更改它,我无法知道它”——收听ACTION_TIME_CHANGED 广播。
  • 广播看起来是一个很好的解决方案...developer.android.com/reference/android/content/…。或者,您可以考虑将 RTC 与 Uptime 时钟进行比较……那么您至少可以知道其中是否只有一个发生了变化,而不是两者都发生了变化。

标签: java android clock reboot uptime


【解决方案1】:

根据文档你可以使用SystemClock.elapsedRealtime()

elapsedRealtime(): 返回自启动以来的毫秒数,包括睡眠时间。

只有在设备重启时才会重置此值。收听广播boot_complete,你就知道是什么时候了。

文档中清楚地指出了 updateMillis() 的问题:

uptimeMillis(): 返回自启动以来的毫秒数,不计算深度睡眠所花费的时间。注意:此值可能会偶尔重置(否则会回绕)。

根据我对文档的理解,通过使用 elapsedRealtime,您的用户无法操纵您的计数器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2011-09-22
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    相关资源
    最近更新 更多