2015-04-17 3 views
2

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

Контекст

Пользователь может, корыто предпочтения, выбрать день, чтобы быть извещать. Я получаю номер от 2 (понедельника) 3 ... 4 ... 5 ... до 1 (воскресенье).

public Calendar getCalendar(){ 
    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.DAY_OF_WEEK,getDayForNotification()); 
    calendar.set(Calendar.HOUR_OF_DAY, 8); 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND, 0); 
    calendar.set(Calendar.MILLISECOND, 0); 
    calendar.set(Calendar.AM_PM,Calendar.AM); 

    return calendar; 
} 

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

public void setNotificationDate() { 

    alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(this, myAlarmReceiver.class); 
    alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0); 

    DateNotificationPreference dateNotificationPreference = new DateNotificationPreference(this); 

    alarmMgr.setRepeating(AlarmManager.RTC, dateNotificationPreference.getCalendar().getTimeInMillis(),AlarmManager.INTERVAL_DAY * 7, alarmIntent); 

} 

Мой радиовещательный приемник

public class myAlarmReceiver extends BroadcastReceiver 
{ 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
    Intent service1 = new Intent(context, AlarmService.class); 
    context.startService(service1); 

    } 
} 

В моей службе, у меня есть Juste один метод:

public void createNotification(){ 
    final NotificationManager mNotification = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

    final Intent launchNotifiactionIntent = new Intent(this, mySilhouette.class); 
    final PendingIntent pendingIntent = PendingIntent.getActivity(this, 
      0, launchNotifiactionIntent, 
      PendingIntent.FLAG_UPDATE_CURRENT); 

    Notification.Builder builder = new Notification.Builder(this) 
      .setWhen(System.currentTimeMillis()) 
      .setSmallIcon(R.drawable.icon_notification) 
      .setContentTitle("my notification") 
      .setContentText("my first notification") 
      .setContentIntent(pendingIntent); 

    mNotification.notify(0, builder.build()); 
} 

Когда я выбираю текущий день, уведомление появляется в хорошее время, но например, когда я перезапустил приложение в 8:05 утра, я снова получил уведомление. После этого, если я выберу еще один день и вернусь к мероприятию, я снова получаю уведомление ... Есть что-то странное, и я не знаю, в чем проблема. Мне нужна ваша помощь :)

Большое спасибо!

Kmel

+0

Вы когда-нибудь выясняли, как проверить, имеете ли вы дело с прошлыми или будущими датами? – Eenvincible

+0

Я попробовал несколько решений, но мне это не удалось. Даже если я делаю чек, уведомление отправляется несколько раз ... – Kmel

ответ

3

set() на Calendar делает только что: он устанавливает значение. В результате дата может быть в прошлом, учитывая ваш существующий код.

Например, где я, сейчас пятница. Итак, объект, возвращаемый Calendar.getInstance(), установлен на данный момент, что означает, что его день недели будет в пятницу. Если вы вызываете set(), чтобы изменить это на вторник, теперь вы можете установить дату в прошлом. Точно так же, даже если вы должны установить день недели в пятницу, это после 8 утра, где я есть, и поэтому вы будете создавать дату, которая была в прошлом.

Необходимо проверить ваш расчетный объект Calendar и посмотреть, был ли он в прошлом. Если это так, добавьте 7 дней, чтобы переместить его на . Следующее недельного времени, чтобы будильник погас.

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

+0

Спасибо за ответ. Теперь я понимаю результат Календаря. Я думал, что 'AlarmManager.INTERVAL_DAY * 7' будет достаточно для перехода на следующую неделю? – Kmel

+0

На самом деле, я пытаюсь понять интерес использовать сигнал тревоги, если мне нужно управлять прошлым днем ​​или днем ​​футура и т. Д. Я думал, что должен был просто назначить день, когда хочу сообщить и предупредить менеджер, я хочу сказать, правильный момент, определенный пользователем, чтобы уведомить его ... :-) – Kmel

Смежные вопросы