2016-11-01 11 views
0

オクラホンでは、ユーザーが設定を切り替えることができるバックグラウンドの更新があります。ここで設定活動からのコードは次のとおりです。ユーザーは毎日のアラームを設定した場合AlarmManager RepeatingAlarmが2回以上発火しない

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に設定すると、アラームは約10AM発生します。また、電話で手動で日付と時刻を変更し続けることができ、毎回起動します。しかし、もし私がオプションを設定して翌日まで待つだけであれば、警報が発射されても発射されなくてもかまいません。私はそれ以上に頻繁に起こることはないと感じています。

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分に電話を切って、それをバックアップしても、サービスはまだ動いています。

問題は、次の日または日に実行されていないことです。なぜ、サービスがバックグラウンドで殺されているのかは分かりません。私はMainActivityのonResumeに同じコードを追加してアラームを再スケジュールすることを考えていましたが、それは少し過度に思え、それを行わずに一貫して実行できるはずです。ポイント下回っ

答えて

0

わからないが、確認してください。

  1. は0 & 1のIDを持つ2つのユニークなアラームを作成したが、起動時に0 idを持つ唯一の1つのアラームを再起動し、完了しました。
  2. 日付を前後に変更して繰り返しアラームをテストする場合、問題が発生する可能性があります。その日のアラームが発生する可能性があり、後で前の日付に変更すると、再起動するまでもう一度その日の火が消えます。
  3. 起動時またはアラームの割り当て時に、保留中のインテントの前回のアラームをキャンセルしてから割り当てる必要があります。
  4. サービスが開始されていないため、保留中の意図がサービスをトリガーするため、サービスは強制終了されません。

まだ問題が発生している場合は、blogにご確認ください。 (どこが間違っているのかわからないので、私のブログのURLを参考にして投稿してください)

+0

私はそれを変えることは間違いありません。 2の場合、データベースを使用して変更を記録するので、データベースにバックアップを作成します。この種のテストでは、変更されたデータベースをバックアップされたデータベースに置き換えます。 3については、私は間違いなくそれを忘れてしまった。 – user2923535

関連する問題