Формат времени getEventTime () для Android AccessibilityService

Я использую AccessibilityService на Android 7. Можно получить метку времени каждого AccessibilityEvent, позвонив getEventTime(). Согласно документации этот метод «получает время, в которое было отправлено это событие».

Кто-нибудь знает, к чему относится возвращаемое значение из getEventTime()? Не похоже, что время Unix.


person machinery    schedule 06.03.2019    source источник


Ответы (1)


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));
}

Как видите, перед отправкой события в поток пользовательского интерфейса они передают SystemClock.uptimeMillis() как параметр в метод setEventType.

Кто-нибудь знает, к чему относится возвращаемое значение getEventTime ()?

Метод getEventTime() возвращает значение, переданное в метод setEventType(time).

SystemClock.uptimeMillis ()

public static long uptimeMillis ()

Возвращает миллисекунды с момента загрузки, не считая времени, проведенного в глубоком сне.

Обновление: на основе вопроса автора.

Если я получаю время загрузки, а затем добавляю uptimeMillis (), это эквивалентно System.currentTimeMillis ()?

Нет это не так.

Из документации по SystemClock для Android.

SystemClock.uptimeMillis ()

отсчитывается в миллисекундах с момента загрузки системы. Эти часы останавливаются, когда система переходит в режим глубокого сна (ЦП выключен, дисплей не горит, устройство ожидает внешнего ввода), но на них не влияют масштабирование часов, режим ожидания или другие механизмы энергосбережения.

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.

person Son Truong    schedule 07.03.2019
comment
Большое спасибо, это имеет смысл. Если я получаю время загрузки, а затем добавляю uptimeMillis (), это эквивалентно System.currentTimeMillis ()? - person machinery; 09.03.2019
comment
Отличный ответ. Не связано, но не могли бы вы рассказать, как вы узнали о существовании AccessibilityManagerService? (Я думаю, так как это внутреннее) - person Richard Miller; 15.02.2020