Запретить / запретить пользователю изменять время в настройках - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть приложение для будильника, которое, когда оно остановлено и активно, будильник будет воспроизводиться в установленное время. И когда пользователь возвращается в приложение, он / она может видеть оставшееся время, оставшееся на тревоге.

Методы и переменные, которые я использую для установки времени, оставшегося до тревоги, используют pendingIntent и Alarm Manager и System.currentTimeMillis ();

Все отлично работает. Если время, например: 10:00 утра, и я установил, что будильник должен быть вызван в 10:40 утра, затем есть таймер обратного отсчета, который показывает оставшееся время с помощью TextView, которое составляет 40 минут, и он считает вниз, пока не достигнет 0. Когда он достиг 0, сигнал тревоги вызван.

Однако, если пользователь заходит в приложение настроек на смартфоне и меняет системное время на 9:00, когда будильник активен. Затем, если я вернусь к приложению будильника, Textview покажет 100 минут до конца. С 10:40 до 9:00 = разница в 100 минут.

Я хочу предотвратить это. Есть ли способ, с помощью которого я могу запретить пользователю изменять системное время, пока активен будильник, или есть какое-то другое решение для этого?

То, что я пытался сделать, это проверить, нет ли System.currentTimeMillis (); в onStart (); меньше сохраненных настроек System.currentTimeMillis (); от onStop. Если оно меньше, я хочу, чтобы сигнал тревоги был вызван немедленно.

Однако, чтобы это работало, пользователь должен вернуться к приложению тревоги после изменения системного времени, если пользователь не вернется, тогда оно не будет работать.

какие решения?

1 Ответ

0 голосов
/ 27 апреля 2018

Ну, вы не хотите говорить человеку, чтобы он не менял время своего телефона. Это его выбор, а не ваш;)

Также, если пользователь устанавливает будильник на 10:40 и говорит, что время 9:00, на самом деле осталось 100 минут. Например, мне нужно проснуться в 7 часов на работу и установить будильник, но потом я замечаю, что мое время впереди на 1 час. Я перевожу время на моем телефоне, но я все еще хочу проснуться в 7, потому что именно тогда я должен идти на работу, и интервал будильника увеличивается.

Таким образом, правильным поведением было бы не называть это будильником (основанным на времени), а таймером - основанным на оставшемся времени. Например, если вы установите таймер на 40 минут, то независимо от того, какое текущее время будет, уведомление будет отправлено через 40 минут.

Для этого вам нужно установить таймер обратного отсчета на определенный интервал, не зависящий от системного времени. Вы все еще можете использовать системное время для первоначального расчета, но для последующих вычислений вы не должны. Так, например, если первоначальный расчет говорит вам, что ваш сигнал тревоги должен выйти из строя через 30 минут, вы можете сделать что-то вроде этого:

long initialTimeLeft= calculateTheTimeFromSystemTime(); // you write that ;)
new CountDownTimer(initialTimeLeft, 1000) {

    public void onTick(long millisUntilFinished) {
        broadcastRemainingTime();
    }

    public void onFinish() {
        broadcastTimerHasFinished();
    }

}.start();

И это, вероятно, будет работать, как и ожидалось;) Время не зависит от системного времени после первой итерации.

Но есть еще одна проблема, с которой вы можете столкнуться. Для того, чтобы справиться с этим, вам нужно будет запустить этот таймер как службу, а когда обратный отсчет завершится до sendBroadcast(), и в главном приложении создать BroadcastReceiver для приема этой трансляции и включения музыки (или любого другого сигнала тревоги). делает). В событии onTick () вы можете транслировать оставшееся время, а в своем приложении вы можете получать эти трансляции и получать оставшееся время.

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

Если вы не используете таймер в качестве службы, тогда вы рассчитываете оставшееся время так:

 long timeLeftInMillis=initialTime;
 timer = new CountDownTimer(initialTime, 1000) {
       @Override
        public void onTick(long millisecondsUntilFinished) {
            timeleft = millisecondsUntilFinished;
        }
      }

Чтобы сделать то же самое с вещательной службой, это будет что-то вроде:

 Intent bi = new Intent("ALARM_COUNTDOWN_INCOMING!");
 public void onTick(long millisecondsUntilFinished) {
                   bi.putExtra("timeleft ", millisUntilFinished);
                   sendBroadcast(bi);
            }

А по основному виду деятельности:

private BroadcastReceiver br = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {            
      long timeLeft = intent.getLongExtra("timeLeft ", 0);
      //Update the text view with that timeLeft
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...