在 Android 上测量长时间的运行时间(重新启动)
Posted
技术标签:
【中文标题】在 Android 上测量长时间的运行时间(重新启动)【英文标题】:Measure long elapsed time (with reboots) on Android 【发布时间】:2013-12-28 12:51:54 【问题描述】:我需要在 android 上测量长时间运行的时间,并且在这期间可能会重新启动设备。
据我了解,System.nanoTime()
每次设备重启时都会重置,System.currentTimeMillis()
不可靠,因为用户可以更改它。
我想出的唯一解决方案是听ACTION_SHUTDOWN
和BOOT_COMPLETED
,使用System.currentTimeMillisec()
计算经过的时间(希望在设备关闭时用户不能更改时钟时间:))并将其添加到我关闭之前的最后一个System.nanoTime()
。
我真的不喜欢这个解决方案,因为它非常昂贵(我需要收听 2 个广播事件)并且不准确,但我想不出任何其他方法来做到这一点。
有什么想法吗?本地解决方案也对我有好处。
【问题讨论】:
我认为没有更好的方法。至少您必须收听两个系统广播,BOOT_COMPLETED 和 ACTION_SHUTDOWN。你可以围绕这两个优化剩余的东西。但这是你必须做的最低限度,我相信。 ***.com/questions/3523442/… 那应该是这两个后面的时间。 Android 设备将根据外部时间源(可能是 NTP、GSM、GPS、?)自行调整System.currentTimeMillisec()
- 无需用户干预,并且可能在启动时(即在 BOOT_COMPLETED
之前)。您也可以使用外部时间服务,但这需要网络访问。
一个愿意覆盖平台时钟来打败你的用户很可能是一个可以拦截/修补你用来读取它们的任何系统调用的用户。
【参考方案1】:
您可以通过使用互联网时间服务器获取您检查的时间来绕过用户更改时间。有几种方法可以做到这一点。
通过 NTP 服务器获取 How to get current time from internet in android How can I get the "network" time, (from the "Automatic" setting called "Use network-provided values"), NOT the time on the phone? 通过 HTTP 标头获取 http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Responses(见Date
标头)
如果你只是保持这个值,那么用户就不会做任何事情来搞乱你的计算。
【讨论】:
你的想法肯定是正确的,但我正在寻找不会增加任何开销的东西,所以使用 NTP 对我来说不是一个合适的解决方案。 据我所知,除非您能以某种方式从运营商那里获得时间戳,否则电话上的解决方案无法保证时间正确。据我所知,这没有暴露。您可能知道收音机基本上是一个独立的操作系统。以上是关于在 Android 上测量长时间的运行时间(重新启动)的主要内容,如果未能解决你的问题,请参考以下文章
Gradle:Resolve dependecies 很长时间的解决办法
SecureCRT连接Ubuntu,centos失败,长时间的重新连接,连接不了解决办法