Java 安卓系统中设置的动作时间在不手动更改时间的情况下被多次调用

Java 安卓系统中设置的动作时间在不手动更改时间的情况下被多次调用,java,android,Java,Android,我有一个听筒,可以收听安卓设置的时间 但有时我会在不改变时间的情况下采取有目的的行动(随机问题) 请帮我解决这个问题 提前谢谢。 代码 我也有同样的问题。如果您的设备已选中“使用网络提供的时间”,则设备将定期更新时间。似乎如果时间被更新,即使是最小的时间修正,时间集广播也会发生。。。我希望可以检查/使用一些阈值参数,以便广播这些次要的时间修正,或者当用户明确更改时间时,广播与设备自身修正时不同。我发现它不可靠,使用ACTION\u TIME\u CHANGED和ACTION\u TIMEZON

我有一个听筒,可以收听安卓设置的时间

但有时我会在不改变时间的情况下采取有目的的行动(随机问题)

请帮我解决这个问题

提前谢谢。 代码



我也有同样的问题。如果您的设备已选中“使用网络提供的时间”,则设备将定期更新时间。似乎如果时间被更新,即使是最小的时间修正,时间集广播也会发生。。。我希望可以检查/使用一些阈值参数,以便广播这些次要的时间修正,或者当用户明确更改时间时,广播与设备自身修正时不同。

我发现它不可靠,使用
ACTION\u TIME\u CHANGED
ACTION\u TIMEZONE\u CHANGED
。有时它会被触发,有时甚至我手动更改设备时间也不会被触发。手动更改设备时间时,会在我的设备上调用两次
ACTION\u time\u changed

根据您的用例和需要,您可以通过每X秒检查一次来计算设备时间(
System.currentTimeMillis()
)是否已手动更改。但它无法检测时区是否发生了变化。由于
System.currentTimeMillis()
可能会更改,但
SystemClock.elapsedRealtime()
不会更改,除非启动设备,所以您可以检测
System.currentTimeMillis()
是否更改

在Kotlin中,示例实现如下所示:

private val TIME_CHANGE_CONTROL_INTERVAL = 10_000L
private val TIME_CHANGE_THRESHOLD = 1_000L
private var lastUptimeTime = SystemClock.elapsedRealtime()
private var lastEpochTime = System.currentTimeMillis()
private lateinit var timeChangeJob: Job

private fun detectTimeChange() {
    val uptimeDifference = SystemClock.elapsedRealtime() - lastUptimeTime
    val epochDifference = System.currentTimeMillis() - lastEpochTime
    val timeChange = Math.abs(uptimeDifference - epochDifference)

    if (timeChange > TIME_CHANGE_THRESHOLD) {
        // Time has changed more than 1sec
    }

    lastUptimeTime = SystemClock.elapsedRealtime()
    lastEpochTime = System.currentTimeMillis()
}

fun listenToDeviceTimeChanges() {
    if (::timeChangeJob.isInitialized) timeChangeJob.cancel()
    timeChangeJob = Job()

    GlobalScope.launch(timeChangeJob) {
        while (isActive) {
            detectTimeChange()
            delay(TIME_CHANGE_CONTROL_INTERVAL)
        }
    }
}

fun unlistenToDeviceTimeChanges() {
    if (::timeChangeJob.isInitialized) timeChangeJob.cancel()

    lastUptimeTime = SystemClock.elapsedRealtime()
    lastEpochTime = System.currentTimeMillis()
}

谢谢,雅其正确,解决了它,“使用网络提供的时间”被检查。现在它可以正常工作了
private val TIME_CHANGE_CONTROL_INTERVAL = 10_000L
private val TIME_CHANGE_THRESHOLD = 1_000L
private var lastUptimeTime = SystemClock.elapsedRealtime()
private var lastEpochTime = System.currentTimeMillis()
private lateinit var timeChangeJob: Job

private fun detectTimeChange() {
    val uptimeDifference = SystemClock.elapsedRealtime() - lastUptimeTime
    val epochDifference = System.currentTimeMillis() - lastEpochTime
    val timeChange = Math.abs(uptimeDifference - epochDifference)

    if (timeChange > TIME_CHANGE_THRESHOLD) {
        // Time has changed more than 1sec
    }

    lastUptimeTime = SystemClock.elapsedRealtime()
    lastEpochTime = System.currentTimeMillis()
}

fun listenToDeviceTimeChanges() {
    if (::timeChangeJob.isInitialized) timeChangeJob.cancel()
    timeChangeJob = Job()

    GlobalScope.launch(timeChangeJob) {
        while (isActive) {
            detectTimeChange()
            delay(TIME_CHANGE_CONTROL_INTERVAL)
        }
    }
}

fun unlistenToDeviceTimeChanges() {
    if (::timeChangeJob.isInitialized) timeChangeJob.cancel()

    lastUptimeTime = SystemClock.elapsedRealtime()
    lastEpochTime = System.currentTimeMillis()
}