2016-04-05 8 views
1

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

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

Как я создал 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); 
} 
+0

Проверьте вы ID, от mPendingIntent = PendingIntent.getBroadcast (контекст, ID, намерение, PendingIntent.FLAG_CANCEL_CURRENT); Вы можете переопределить другие аварийные сигналы и установить только 1. Если вы установите более старую тревогу, это не должно мешать другому, но идентификаторы, которые вы установили для них, будут – Tazz

ответ

2

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

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

редактировать:

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

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

// ensure the next alarm is in the future 
while(diffTime < 0) { 
    diffTime += RepeatTime; 
} 
+0

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

+0

Итак, вы имеете в виду, что мой метод setRepeatAlarm() будет похож на тот, который я опубликовал выше, см. ОБНОВЛЕННЫЙ раздел – Sun

+0

точно, и для не повторяющегося сигнала тревоги просто не воссоздайте его, если 'diffTime' отрицательный – bwt