我在Android 7上使用AccessibilityService
。可以通过调用AccessibilityEvent
来获取每个getEventTime()
的时间戳。根据文档,这个方法“获取发送此事件的时间”。
有人知道getEventTime()
的回报值是什么意思吗?它似乎不是Unix时间。
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)
方法的值。
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 Intent广播以查明时间的变化。
简而言之,SystemClock.uptimeMillis()
以毫秒为单位从启动时间返回时间,每次用户关闭电话并重新启动时,它都会重置。例如,你打开手机,10秒后,如果你调用这个方法,它将返回(10 * 1000 = 10000),20秒后,它将是20000,依此类推。
另一方面,System.currentTimeMillis()
将在几毫秒内从Epoch time返回时间。它会将当前日期时间转换为毫秒,因此如果您更改设置中的当前日期时间或使用setCurrentTimeMillis(long)
API,它将会生效。