#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 минуты, вы можете сделать вывод, что произошло изменение времени. После этого вы просто обновляете новое время для общих настроек. Вот и все.
- Зарегистрируйтесь для трансляции ACTION_TIME_TICK.
- При получении широковещательной передачи: 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");
}
}