2015-01-02 2 views
0

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

Аварийный менеджер прекрасно работает, когда пользователь устанавливает (и запускает приложение в первый раз) с 6 до 9 утра, однако если пользователь запускает приложение в первый раз после 9 часов утра, я должен добавить день и запустите будильник на следующий день в 6 утра. При этом (изменение даты на следующий день) будильник срабатывает в случайное время, около 10 часов вечера (это огромная разница). Вот мой код»

public notification(Context context) { 

    this.context=context; 

    Intent appstart=new Intent(context,appstartreceiver.class); 
    PendingIntent pi=PendingIntent.getBroadcast(context,0,appstart,PendingIntent.FLAG_UPDATE_CURRENT); // For appstart in the morning 
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(context.ALARM_SERVICE); 

    Calendar currentCal=Calendar.getInstance(); 
    Calendar startapp = Calendar.getInstance();// FOr app start in the morning 

    startapp.set(Calendar.HOUR_OF_DAY,6); 
    startapp.set(Calendar.MINUTE, 0); 
    startapp.set(Calendar.SECOND, 0); 


    long currentTime = currentCal.getTimeInMillis(); 


    int diff=(int)(currentTime-startapp.getTimeInMillis())/(1000*60*60); 

    if (diff<3) 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,startapp.getTimeInMillis(),1000*24*60*60,pi); 
    else { 

     startapp.add(Calendar.HOUR_OF_DAY, 24); 


     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, startapp.getTimeInMillis(), 1000 * 24 * 60 * 60, pi); 
    } 

} 
+0

Я не получил вашу часть. Если вы хотите установить повторяющийся сигнал тревоги каждый день в 6 часов утра, тогда alarmManager.setRepeating (AlarmManager.RTC_WAKEUP, startapp.getTimeInMillis(), 1000 * 24 * 60 * 60, pi); достаточно. – Chandrakanth

+0

При этом, когда пользователь устанавливает приложение, скажем, 1 PM, андроид планирует будильник на следующий день в 13:00, а не 6! Это проблематично! –

+0

Нет, он будет срабатывать только с 6 часов ... Я думаю, что вы протестировали вот так ... после запуска приложения в 1 час дня, после чего вы изменили дату устройства на следующий день, тогда ваш будильник будет запущен в это время. .это правильно?? – Chandrakanth

ответ

1

Замените код ниже кода ... это будет срабатывать каждый день в 6 часов утра. Это может поможет.

public void notification(Context context) { 

    Intent intent = new Intent(this, appstartreceiver.class); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 99, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, 6); 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND, 0); 

    long startUpTime = calendar.getTimeInMillis(); 

    // To avoid firing the alarm if the time is passed while setting 
    if (System.currentTimeMillis() > startUpTime) { 
     startUpTime = startUpTime + 24 * 60 * 60 * 1000; 
    } 

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, startUpTime, 24 * 60 * 60 * 1000, pendingIntent); 
} 
+0

Спасибо за ваш ответ. Я пробовал код, и это дает мне ту же проблему, что и раньше. Вероятно, я должен попробовать его на другом телефоне или в эмуляторе. еще раз спасибо –

0

Попробуйте бодрствующие пристальные услуги commonwares, это может помочь.

public class DailyListener implements AlarmListener { 
    public void scheduleAlarms(AlarmManager mgr, PendingIntent pi, Context context) { 

      // every day at scheduled time 
      Calendar calendar = Calendar.getInstance(); 
      // if it's after or equal 6 am schedule for next day 
      if (Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 6) { 
       calendar.add(Calendar.DAY_OF_YEAR, 1); 
      } 
      calendar.set(Calendar.HOUR_OF_DAY, 6); 
      calendar.set(Calendar.MINUTE, 0); 
      calendar.set(Calendar.SECOND, 0); 

     mgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi); 


    } 
} 
1

Вы можете попробовать добавить день

if (calendar.before(Calendar.getInstance())) { calendar.add(Calendar.DAY_OF_MONTH, 1); } ....// your code

Таким образом, он будет срабатывать каждый день в установленное время.

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