Android: есть ли какая-либо дополнительная информация из Intent.ACTION_TIME_CHANGED?

#android #broadcastreceiver #android-intent

#Android #broadcastreceiver #android-намерение

Вопрос:

Есть ли какая-либо дополнительная информация, доступная из Intent.ACTION_TIME_CHANGED? В getData() или getExtras() ничего нет.

Я хотел бы знать:

  • Время, которое телефон имел до установки нового времени;

  • Кто изменил время: пользователь (вручную) или оператор телефонной связи?

Любой другой способ получить эту информацию приветствуется!

Ответ №1:

Я просмотрел исходный код Android, и в этой трансляции нет никаких дополнений. Итак, нет способа узнать эту информацию.

Комментарии:

1. Спасибо за исследование этого. Я просто хотел прокомментировать, что это серьезно снижает удобство использования трансляции! Я отправляю временные метки для действий пользователя (состояние доставки груза) с помощью gps. Я также записываю смещение системного времени до времени gps. К сожалению, я регулярно получаю огромные неправильные скачки, когда сигнал gps пропадает / слишком плохо. И единственное, что я могу сделать, это предположить, что системное время точно соответствует времени gps (оба взяты как utc), когда поступает эта трансляция. Я предполагаю, что это также приведет к сбою.

Ответ №2:

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

Зарегистрируйтесь для широковещательного действия ACTION_TIME_TICK (это будет транслироваться каждую минуту).

Когда время тикает, если между вашим текущим временем и временем последнего тика разница более 1 минуты, вы можете сделать вывод, что произошло изменение времени. После этого вы просто обновляете новое время для общих настроек. Вот и все.

  1. Зарегистрируйтесь для трансляции ACTION_TIME_TICK.
  2. При получении широковещательной передачи: 2.1 При первой трансляции введите текущее системное время в общие настройки. 2.2 еще сравните текущее время с ранее введенным временем, и если разница составляет более 1 минуты, это означает, что время изменилось. Затем обновите новое системное время до SP.

Счастливого кодирования.

Комментарии:

1. Я часто использую системные временные метки utc, чтобы запомнить, что было сделано, когда, поэтому мне не нужно везде использовать таймеры, но при необходимости можно проверить возраст определенных оценок. Я постараюсь использовать эту идею без сохранения на диск во время работы моей службы gps. Когда служба отключена, вы можете пропустить какое-то ACTION_TIME_CHANGED, поэтому при перезапуске вы неправильно вычислите разницу во времени. Пока служба работает, я постараюсь использовать эту идею. Это может помочь с любыми «таймерами», которые не требуют точности более 1 минуты и не работают дольше, чем обычно работает моя служба (8 часов). Спасибо

Ответ №3:

Я не думаю, что получение причины изменения времени возможно, хотя выяснить, сколько времени было изменено, должно быть возможно путем сравнения System.currentTimeMillis() с SystemClock.elapsedRealtime() , поскольку SystemClock.elapsedRealtime() в этом случае не настраивается.

Примером может быть что-то вроде:

 private long realtimeOffset = System.currentTimeMillis() - SystemClock.elapsedRealtime();
private void onReceive(Context context, Intent intent) {
    if(Intent.ACTION_TIME_CHANGED.equals(intent.getAction()) {
        long prevRealtimeOffset = realtimeOffset;
        realtimeOffset = System.currentTimeMillis() - SystemClock.elapsedRealtime();
        Log.i(TAG, "Clock was adjusted by: "   (realtimeOffset - prevRealtimeOffset)   " ms");
    }
}