Android无障碍服务中的getEventTime()时间格式

4

我在Android 7上使用AccessibilityService。可以通过调用getEventTime()获取每个AccessibilityEvent的时间戳。根据文档,此方法将“获取此事件发送的时间”。

有人知道getEventTime()的返回值是什么吗?它似乎不是Unix时间。

1个回答

6

AccessibilityManagerService

这个类作为系统级别服务被系统实例化,只能由系统访问。该服务的任务是成为设备上生成的所有{@link AccessibilityEvent}的集中事件分发。事件将分发到{@link AccessibilityService}。

AccessibilityManagerService源代码内部。

private void sendAccessibilityEventLocked(AccessibilityEvent event, int userId) {
    // Resync to avoid calling out with the lock held
    event.setEventTime(SystemClock.uptimeMillis());
    mMainHandler.sendMessage(obtainMessage(
            AccessibilityManagerService::sendAccessibilityEvent,
            this, event, userId));
}

正如你所见,在将事件发送到UI线程之前,它们将SystemClock.uptimeMillis()作为参数传递给setEventType方法。

有人知道getEventTime()返回值是什么吗?

getEventTime()方法返回的是传递给setEventType(time)方法的值。

SystemClock.uptimeMillis()

public static long uptimeMillis ()

返回自启动以来的毫秒数,不包括深度休眠时间。

更新:根据作者的问题

如果我获取启动时间,然后添加uptimeMillis(),是否等同于System.currentTimeMillis()?

不是。

来自SystemClock android文档。

SystemClock.uptimeMillis()

这个函数返回自系统启动以来经过的毫秒数。当系统进入深度睡眠(CPU关闭,显示器暗淡,设备等待外部输入)时,此时钟会停止计时,但不受时钟缩放、空闲或其他节能机制的影响。

System.currentTimeMillis()

这是标准的“墙”时钟(时间和日期),表示自纪元以来的毫秒数。墙上钟可以由用户或手机网络设置(请参见setCurrentTimeMillis(long)),因此时间可能会不可预测地向前或向后跳动。只有在与现实世界的日期和时间对应很重要的情况下,例如在日历或闹钟应用程序中,才应使用此时钟。间隔或经过的时间测量应使用另一个时钟。如果您正在使用System.currentTimeMillis(),请考虑侦听ACTION_TIME_TICK、ACTION_TIME_CHANGED和ACTION_TIMEZONE_CHANGED意图广播,以了解时间何时更改。

简而言之,SystemClock.uptimeMillis() 返回自开机以来的毫秒数,每次用户关机并重新启动手机时都会重置。例如,您打开手机,在10秒后调用此方法,它将返回(10 * 1000 = 10000)毫秒,20秒后它将是20000毫秒,以此类推。
另一方面,System.currentTimeMillis() 将返回自纪元时间以来的毫秒数。它将当前日期时间转换为毫秒,因此如果您在设置中更改当前日期时间或使用setCurrentTimeMillis(long) API,则会受到影响。

非常感谢,这很有道理。如果我获取启动时间,然后加上uptimeMillis(),这是否等同于System.currentTimeMillis()? - machinery
非常好的答案。虽然不相关,但您可以分享一下您是如何发现AccessibilityManagerService存在的吗?(我猜因为它是内部的) - Richard Miller

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