2016-11-01 5 views
0

Итак, у меня есть фоновое обновление, которое пользователь может переключать в настройках. Вот код от деятельности Настройки:AlarmManager RepeatingAlarm не срабатывает более одного раза

intent = new Intent(context, UpdateScoresService.class); 
recurringDownloadDaily = PendingIntent.getService(context,0,intent, 0); 
recurringDownloadWeekly = PendingIntent.getService(context, 1, intent, 0); 
Preference.OnPreferenceChangeListener refreshListener = new Preference.OnPreferenceChangeListener() { 
       @Override 
       public boolean onPreferenceChange(Preference preference, Object newValue) { 
        if(newValue.toString().equals("1")){ /* daily */ 
         background_refresh.setSummary("Scores will be refreshed daily."); 

         AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); 
         manager.cancel(recurringDownloadDaily); 
         manager.cancel(recurringDownloadWeekly); 
         Log.e("DAILY REFRESH", " "); 
         Calendar calendar = Calendar.getInstance(); 
         calendar.setTimeInMillis(System.currentTimeMillis()); 
         calendar.set(Calendar.HOUR_OF_DAY,10); 
         calendar.set(Calendar.MINUTE,00); 
         if(calendar.before(Calendar.getInstance())){ 
          Log.e("AFTER", "10 AM DAILY"); 
          calendar.add(Calendar.DATE, 1); 
         } 
         manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, recurringDownloadDaily); 
        }else if(newValue.toString().equals("2")){ /* weekly */ 
         Log.e("WEEKLY REFRESH", " "); 
         background_refresh.setSummary("Scores will be refreshed weekly."); 
         AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); 
         manager.cancel(recurringDownloadDaily); 
         manager.cancel(recurringDownloadWeekly); 
         Calendar calendar = Calendar.getInstance(); 
         calendar.setTimeInMillis(System.currentTimeMillis()); 
         calendar.set(Calendar.HOUR_OF_DAY,10); 
         calendar.set(Calendar.MINUTE,00); 
         if(calendar.before(Calendar.getInstance())){ 
          Log.e("AFTER", "10 AM WEEKLY"); 
          calendar.add(Calendar.DATE, 1); 
         } 
         manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, recurringDownloadWeekly); 
        }else{ /* manually */ 
         background_refresh.setSummary("Scores will be refreshed manually."); 
         Log.e("MANUAL REFRESH", " "); 
         AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); 
         manager.cancel(recurringDownloadDaily); 
         manager.cancel(recurringDownloadWeekly); 
        } 
        return true; 
       } 
      }; 
      background_refresh.setOnPreferenceChangeListener(refreshListener); 

Если пользователь устанавливает ежедневный будильник, я ожидаю, что это обновить каждое утро в 10 часов утра. Для тестирования, когда я установил дату на следующий день и установил время до 9:59, будильник срабатывает около 10 утра. И может постоянно менять дату и время на телефоне, и он срабатывает каждый раз. Однако, похоже, если я установил опцию и просто подожду до следующего дня, будильник может или не может срабатывать. Я чувствую, что чаще всего этого не бывает.

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

public void onReceive(Context context, Intent intent) { 
     Log.e("Boot reciever", "a"); 
     if(intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 
//   Toast.makeText(context, "Boot Reciever", Toast.LENGTH_SHORT).show(); 
      Log.e("Boot reciever", "b"); 
      SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); 
      intent1 = new Intent(context, UpdateScoresService.class); 
      recurringDownload = PendingIntent.getService(context,0,intent1, 0); 

      String refreshRate = sharedPreferences.getString("background_refresh", "1"); 

      if(refreshRate.equals("1")){ /* daily */ 
       daily(context); 
      }else if(refreshRate.equals("2")){ /* weekly */ 
       weekly(context); 
      }else { /* manually */ 
       manually(context); 
      } 

     } 
    } 

    public void daily(Context context){ 
     Log.e("DAILY REFRESH", "BRUH!"); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     calendar.set(Calendar.HOUR_OF_DAY,10); 
     calendar.set(Calendar.MINUTE,00); 
     if(calendar.before(Calendar.getInstance())){ 
      Log.e("AFTER", "10 AM WEEKLY"); 
      calendar.add(Calendar.DATE, 1); 
     } 
     AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     manager.setInexactRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY, recurringDownload); 
    } 
    public void weekly(Context context){ 
     Log.e("WEEKLY REFRESH", "BRUH!"); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     calendar.set(Calendar.HOUR_OF_DAY,10); 
     calendar.set(Calendar.MINUTE,00); 
     if(calendar.before(Calendar.getInstance())){ 
      Log.e("AFTER", "10 AM WEEKLY"); 
      calendar.add(Calendar.DATE, 1); 
     } 
     AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     manager.setInexactRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY * 7, recurringDownload); 
    } 

    public void manually(Context context){ 
     Log.e("MANUAL REFRESH", "BRUH!"); 
     AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     manager.cancel(recurringDownload); 
    } 

И насколько я могу сказать, что это, кажется, работает, как хорошо, если я выключу телефон в 9:55 и загрузив его обратно, служба все еще работает.

Проблема в том, что она не работает на следующий день или дни. Я не совсем уверен, почему, может быть, служба убивается в фоновом режиме? Я думал о добавлении того же кода в onResume MainActivity, чтобы перенести сигнал тревоги, но это кажется немного чрезмерным, и я должен иметь возможность заставить его работать последовательно, не делая этого.

ответ

0

Не уверен, но проверьте ниже пунктов:

  1. создал два уникальных аварийных сигналов с 0 & 1 идентификаторами, но при загрузке завершения перезагрузки только один сигнал тревоги с 0 ID.
  2. При тестировании с повторяющимися тревогами с изменением даты взад и вперед может возникнуть проблема. Поскольку тревога за этот день может быть запущена, а позже вы переходите на предыдущую дату, она не будет запускаться в тот же день еще раз, пока не перезапустит ее.
  3. При загрузке или назначении каких-либо аварийных сигналов вы должны отменить предыдущие аварийные сигналы для этого ожидающего намерения перед назначением ему.
  4. Вы не убиты, потому что они еще не запущены, так как ожидающие намерения должны быть вызваны службой.

Если вы все еще сталкиваетесь с проблемой, пожалуйста, проверьте это blog. (Не знаете, где это пошло не так, поэтому отправляйте мой URL-адрес блога для ссылок)

+0

Для 1, ты прав, хм, я обязательно изменю это. Для 2 я использую базу данных для регистрации изменений, поэтому я просто делаю резервную копию базы данных, и когда я закончил этот тип тестирования, я заменю измененную базу данных на резервную копию. Для 3 я определенно забыл сделать это. – user2923535

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