Напоминания не срабатывают в нужное время

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

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

Например, я создал 5 разных напоминаний: одно для срабатывания каждый день, второе для срабатывания каждые 2 дня, третье для срабатывания каждые 3 дня, четвертое для срабатывания еженедельно и пятое для срабатывания ежемесячно.

Но всякий раз, когда я перезагружаю свое устройство, все они срабатывают в одно и то же время (например, если я перезагружаю свое устройство в 05:00, то все они срабатывают одновременно), тогда как я ожидал, что Eye Drop сработает в 12:15, а Cyrip сработает. в 13:20 каждый второй день и так далее.

AlarmReceiver.java:

public void setRepeatAlarm(Context context, Calendar calendar, int ID, long RepeatTime) {
    mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    // Put Reminder ID in Intent Extra
    Intent intent = new Intent(context, AlarmReceiver.class);
    intent.putExtra(ReminderEditActivity.EXTRA_REMINDER_ID, Integer.toString(ID));
    mPendingIntent = PendingIntent.getBroadcast(context, ID, intent, PendingIntent.FLAG_CANCEL_CURRENT);

    // Calculate notification timein
    Calendar c = Calendar.getInstance();
    long currentTime = c.getTimeInMillis();
    long diffTime = calendar.getTimeInMillis() - currentTime;

    // Start alarm using initial notification time and repeat interval time
    mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME,
            SystemClock.elapsedRealtime() + diffTime,
            RepeatTime , mPendingIntent);

    // Restart alarm if device is rebooted
    ComponentName receiver = new ComponentName(context, BootReceiver.class);
    PackageManager pm = context.getPackageManager();
    pm.setComponentEnabledSetting(receiver,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
}

person Sun    schedule 05.04.2016    source источник
comment
Проверьте свой идентификатор из mPendingIntent = PendingIntent.getBroadcast (контекст, идентификатор, намерение, PendingIntent.FLAG_CANCEL_CURRENT); Вы можете переопределить другие будильники и установить только 1. Если вы установите более старый будильник, он не должен мешать другому, но установленные для них идентификаторы будут   -  person Tazz    schedule 05.05.2016


Ответы (1)


Когда вы (повторно) создаете сигналы тревоги (например, в загрузочном приемнике), вы должны настроить дату, добавив интервалы повторения, пока дата не окажется в будущем.

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

изменить:

Например, в setRepeatAlarm() вы можете:

// Calculate notification timein
...
long diffTime = ...

// ensure the next alarm is in the future
while(diffTime < 0) {
    diffTime += RepeatTime;
}
person bwt    schedule 04.05.2016
comment
да, я думаю, что вы правы.... но могу ли я узнать, как я могу контролировать это, чтобы мои напоминания срабатывали только вовремя. - person Sun; 05.05.2016
comment
так что вы имеете в виду, что, наконец, мой метод setRepeatAlarm() будет выглядеть так, как я разместил выше, см. раздел ОБНОВЛЕНО - person Sun; 05.05.2016
comment
точно, а для неповторяющегося будильника просто не создавать его заново, если diffTime отрицательное - person bwt; 05.05.2016
comment
Большое вам спасибо :) Я потратил день, чтобы протестировать функциональность напоминаний, и вы будете счастливы, что они работают просто идеально, большое вам спасибо (щедрость + принятие + полезность), это то, чем я могу вознаградить вас, и я сделал. Еще одна вещь, мне снова нужна ваша помощь, я добавил еще один столбец в качестве даты окончания выбора, сохранив эту дату в базе данных вместе с другими данными напоминания, поэтому могу ли я узнать, как выполнить функцию удаления напоминания на основе даты окончания, выбранной для напоминания... . - person Sun; 06.05.2016
comment
Вы можете проверить каждый раз, когда срабатывает будильник, не выходит ли следующий раз за дату окончания, что-то вроде nowCalendar.getTimeInMillis() + repeatTime > endCalendar.getTimeInMillis(), и если да, отменить его. Возможно, будет проще справиться с повторением самостоятельно, т. е. использовать только неповторяющиеся будильники и каждый раз планировать следующий. Это то, что вам нужно сделать в любом случае, если вы хотите использовать точные сигналы тревоги на API 19+ (больше нет точных повторяющихся сигналов тревоги) - person bwt; 06.05.2016
comment
Эй... взгляните на проблему, возникшую из-за diffTime += RepeatTime; Надеюсь, вы можете предоставить мне решение, потому что вы лучше знаете, чем кто-либо другой stackoverflow.com/questions/37201956/ - person Sun; 13.05.2016