在Android上测量长时间(包括重新启动后)的经过时间

6
我需要在Android上测量长时间间隔,但可能会在其中发生设备重启。
据我所了解,System.nanoTime() 每次设备重启都会被重置,而 System.currentTimeMillis() 不可靠,因为用户可以更改它。
我能想到的唯一解决方案是监听 ACTION_SHUTDOWN 和 BOOT_COMPLETED,使用 System.currentTimeMillis() 计算经过的时间(希望用户在设备关闭时无法更改时钟)并将其添加到之前关闭前拥有的最后一个 System.nanoTime() 中。
老实说,我不喜欢这个解决方案,因为它既昂贵(我需要监听2个广播事件),又不准确,但我想不出其他方法来解决这个问题。
有什么好主意吗?对我来说,本地解决方案也很好。

1
我认为没有更好的方法了。至少你需要监听两个系统广播,即BOOT_COMPLETED和ACTION_SHUTDOWN。你可以围绕这两个广播来优化其余的内容。但我相信这是你必须要做的最低限度。 - VJ Vélan Solutions
1
这是关于两种时间的区别:clock_realtimeclock_monotonic。Android设备会根据外部时间源(可能是NTP、GSM、GPS等)自动调整System.currentTimeMillisec(),无需用户干预,而且可能在启动时(即在BOOT_COMPLETED之前)进行。您也可以使用外部时间服务,但需要网络访问。 - zapl
1
一个愿意覆盖平台时钟以打败你的用户很可能是一个可以拦截/修补你正在使用的任何系统调用来读取它们的用户。 - Chris Stratton
1个回答

1
您可以通过使用互联网时间服务器来获取检查时的时间,以此来避免用户更改时间。有几种方法可以做到这一点。

如果您简单地持久化这个值,那么用户就无法破坏您的计算。


1
你的想法肯定是正确的,但我正在寻找一些不会增加任何开销的东西,所以对我来说使用NTP不是一个合适的解决方案。 - dmarcato
1
据我所知,除非您可以从运营商那里获取时间戳,否则在手机上没有保证正确的时间解决方案。据我所见,这并没有暴露出来。正如您所知,无线电基本上是一个独立的操作系统。 - David S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接