Android AccessibilityService getEventTime() 时间格式

mac*_*ery 3 android accessibilityservice android-accessibility

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

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

Nhấ*_*ang 5

无障碍管理服务

此类由系统实例化为系统级服务,只能由系统访问。此服务的任务是为在设备上的所有进程中生成的 {@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));
}
Run Code Online (Sandbox Code Playgroud)

如您所见,在向 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 中更改当前日期时间,它将受到影响。