Как установить часовой пояс AlarmManager для всех пользователей? - PullRequest
0 голосов
/ 07 апреля 2019

Мне нужно, чтобы все пользователи были перенаправлены на мероприятие одновременно, независимо от того, какой у них часовой пояс или какое время для их телефона установлено, поэтому мне нужно указать конкретный часовой пояс, который следует учитывать в AlarmManager, независимо от того, что пользователь имеет время в своем телефоне. Однако setTimeZone в AlarmManager работает только в системных приложениях. Так в чем же решение?

Вот мой код:

Intent intent = new Intent(Start.this, Playing.class);
                        PendingIntent pendingIntent = PendingIntent.getActivity(Start.this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
                        ((AlarmManager) getSystemService(ALARM_SERVICE)).setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

1 Ответ

1 голос
/ 07 апреля 2019

Я не являюсь разработчиком Android, но то, как я читаю документацию, безо всякой необходимости делать что-то особенное.Когда вы устанавливаете будильник, вы указываете количество миллисекунд с начала эпохи, когда оно должно сработать.Эпоха определяется независимо от часовых поясов.Поэтому, если вы просто передадите одно и то же значение triggerAtMillis на всех устройствах, будильник сработает в одно и то же время на всех устройствах независимо от их часовых поясов.

AlarmManager имеет метод setTimeZoneтоже, но (1) он вам не нужен, и (2) он установит часовой пояс для всей системы, который вашим пользователям, вероятно, не нужен.

Редактировать: Получение четко определенноговремя, используя java.time

Поскольку вы получаете миллисекунды от calendar.getTimeInMillis(), если вы получаете неправильное время, проблема в календаре.

Возможно, вы захотите решитьдобавив ThreeTenABP в ваш проект Android, чтобы вы могли использовать java.time, современный Java-интерфейс даты и времени, для вычисления миллисекунд.Смотрите ссылки внизу.Класс Calendar плохо спроектирован и давно устарел, а современный API гораздо приятнее в работе и в целом дает более четкий код.Например:

    ZoneId alarmZone = ZoneId.of("America/Argentina/Salta");
    ZonedDateTime alarmDateTime = ZonedDateTime.of(2019, 4, 10, 14, 30, 0, 0, alarmZone);
    long triggerAtMillis = alarmDateTime.toInstant().toEpochMilli();

    System.out.println(triggerAtMillis);

Выходное значение само по себе не очень интересно:

1554917400000

Дело в том, что, поскольку мы жестко закодироваличасовой пояс в фрагменте кода, значение будет одинаковым независимо от часового пояса устройства, и, следовательно, ваш будильник будет срабатывать одновременно на всех устройствах (при условии, что их часы установлены правильно).

Вопрос: Могу ли я использовать java.time на моей версии Android?Нужно ли мне ThreeTenABP?

java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26) современный API поставляется встроенным.
  • В Java 6 и 7 получают ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старых) Android используется версия ThreeTen для AndroidBackport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

...