我如何才能获得正确的当前日期和时间的Android设备,而设备离线

eqqqjvef  于 2023-01-11  发布在  Android
关注(0)|答案(2)|浏览(146)

我创建了一个Android应用程序,在这个应用程序中,用户可以保存一些任务。这些任务保存在设备中,当用户上网时,任务将同步到服务器。我需要知道用户保存任务的正确日期和时间。像Calendar.getInstance()new Date()代码返回设备时间,如果设备时间不正确,任务保存的日期错误。此应用程序脱机工作非常重要。由于此应用程序过于繁忙,用户可能会故意更改设备时间。

6jygbczu

6jygbczu1#

因此,我最终得出这样一个方案:每次设备重启时,用户最多只连接到互联网一次。

我尝试在用户引导时连接到NTP服务器(BOOT_COMPLETED BroadcastReceiver)或网络状态更改(CONNECTIVITY_CHANGE and WIFI_STATE_CHANGED BroadcastReceiver),然后我将该日期和SystemClock.elapsedRealtime()存储在数据库中。之后,当我想要获得正确的日期时,我只需获取新的SystemClock.elapsedRealtime(),并计算该值与数据库中的elapsedRealtime值的差值,然后将该差值添加到我存储在数据库中的日期中。

8iwquhpp

8iwquhpp2#

对于其他有同样问题的人,有一个强大的库,名为TrueTime。要使用它,请将其添加到您的项目依赖项中:

implementation 'com.github.instacart.truetime-android:library-extension-rx:3.5'

Application类的onCreate方法中[如果使用RxJava]:

TrueTimeRx.build()
        .withLoggingEnabled(true)
        .withSharedPreferencesCache(this)
        .initializeRx("1.us.pool.ntp.org")
        .subscribeOn(Schedulers.io())
        .subscribe(date -> Log.v("TrueTime", "TrueTime initialized, time: " + date),
                throwable -> Log.e("TrueTime", "TrueTime exception: ", throwable)
        );

和使用:

if (TrueTimeRx.isInitialized()) {
    Date reliableDateNow = TrueTimeRx.now();
    // use the current date
}

工作原理:
它使用NTP协议仅从网络初始化日期时间一次。并使用SystemClock. elapsedRealtime()计算日期时间。如果设备重新启动,它将使用指定的NTP服务器重新初始化时间。
Github存储库:https://github.com/instacart/truetime-android/

相关问题