我尝试在用户引导时连接到NTP服务器(BOOT_COMPLETED BroadcastReceiver)或网络状态更改(CONNECTIVITY_CHANGE and WIFI_STATE_CHANGED BroadcastReceiver),然后我将该日期和SystemClock.elapsedRealtime()存储在数据库中。之后,当我想要获得正确的日期时,我只需获取新的SystemClock.elapsedRealtime(),并计算该值与数据库中的elapsedRealtime值的差值,然后将该差值添加到我存储在数据库中的日期中。
2条答案
按热度按时间6jygbczu1#
因此,我最终得出这样一个方案:每次设备重启时,用户最多只连接到互联网一次。
我尝试在用户引导时连接到NTP服务器(
BOOT_COMPLETED BroadcastReceiver
)或网络状态更改(CONNECTIVITY_CHANGE and WIFI_STATE_CHANGED BroadcastReceiver
),然后我将该日期和SystemClock.elapsedRealtime()
存储在数据库中。之后,当我想要获得正确的日期时,我只需获取新的SystemClock.elapsedRealtime()
,并计算该值与数据库中的elapsedRealtime值的差值,然后将该差值添加到我存储在数据库中的日期中。8iwquhpp2#
对于其他有同样问题的人,有一个强大的库,名为TrueTime。要使用它,请将其添加到您的项目依赖项中:
在
Application
类的onCreate方法中[如果使用RxJava]:和使用:
工作原理:
它使用NTP协议仅从网络初始化日期时间一次。并使用SystemClock. elapsedRealtime()计算日期时间。如果设备重新启动,它将使用指定的NTP服务器重新初始化时间。
Github存储库:https://github.com/instacart/truetime-android/