Ну, вы не хотите говорить человеку, чтобы он не менял время своего телефона. Это его выбор, а не ваш;)
Также, если пользователь устанавливает будильник на 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
}
};