2017-05-10 9 views
0

매년 5 월 8 일과 5 월 12 일 사이에 한 번만 알림을 보내려합니다.알림을 설정하는 방법은 매년 한 번만 보내시겠습니까?

하지만 난 다른 년과 비교, 그것은 사용자가 응용 프로그램을 시작하거나 시간이

월 8 월 (12) 사이에 있다면 그것은의 많은 저를 혼동 있다고 재부팅 때 통지마다 시간을 보낼 것입니다 원인이 붙어 몇 시간 동안이 문제를 해결하는 방법을 가르쳐 줄 수 있습니다.

미리 감사드립니다.

내 매니페스트 :

//Setting 
public void startAlarmSetting() { 
    Toast.makeText(this, "Starting setting", Toast.LENGTH_SHORT).show(); 

    Calendar cal = Calendar.getInstance(); 

    int year = cal.get(Calendar.YEAR); 

    Intent intent = new Intent(this, PlayReceiver.class); 
    intent.putExtra("msg", "play_hskay"); 

    PendingIntent pi = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_ONE_SHOT); 

    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pi); 

    long time = cal.getTimeInMillis(); 
    //Save the time when user start application 
    SharedPreferences preferences = getSharedPreferences("time", MODE_PRIVATE); 
    preferences.edit().putLong("saveTime", time) 
      .putInt("saveFirstYear",2017) 
      .putInt("saveNextYear",year) 
      .putBoolean("saveBoolean",true) 
      .apply(); 
} 

내 PlayReceiver : 내 주요 활동이 booleanyear을 절약 할 수

<application> 
     <!-- --> 
     <receiver android:name=".AlarmSetting.PlayReceiver"> 
      <intent-filter> 
       <action android:name="play_hskay" /> 
      </intent-filter> 
     </receiver> 

     <!-- --> 
     <receiver android:name=".AlarmSetting.AlarmInitReceiver"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 
</application> 

코드 if (neverSend || !(firstYear == nextYear)){의이 라인은 나에게

public class PlayReceiver extends BroadcastReceiver { 

     private Context context; 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      Toast.makeText(context, "Starting playReceiver TDU", Toast.LENGTH_SHORT).show(); 

      Bundle bData = intent.getExtras(); 

      // load current time 
      Calendar current = Calendar.getInstance(); 
      //set first time 
      Calendar firstLimit = Calendar.getInstance(); 
      firstLimit.set(Calendar.MONTH, 4); 
      firstLimit.set(Calendar.DAY_OF_MONTH, 8); 
      firstLimit.set(Calendar.HOUR, 12); 
      firstLimit.set(Calendar.MINUTE, 30); 
      firstLimit.set(Calendar.SECOND, 30); 
      //set second time 
      Calendar secondLimit = Calendar.getInstance(); 
      secondLimit.set(Calendar.MONTH, 4); 
      secondLimit.set(Calendar.DAY_OF_MONTH, 12); 
      secondLimit.set(Calendar.HOUR, 12); 
      secondLimit.set(Calendar.MINUTE, 30); 
      secondLimit.set(Calendar.SECOND, 30); 

      SharedPreferences preferences = context.getSharedPreferences("time", context.MODE_PRIVATE); 
      boolean neverSend = preferences.getBoolean("saveBoolean",false); 
      //int firstYear = preferences.getInt("saveFirstYear",0); 
      int firstYear = 2017; 
      int nextYear = preferences.getInt("saveNextYear",0); 
      //neverSend will be true when first time. 
      if (neverSend || !(firstYear == nextYear)){ 

      if (current.after(firstLimit) && current.before(secondLimit)) { 
       if (bData.get("msg").equals("play_hskay")) { 
       sendNotification(); 
    //change the nextYear and save it. 
    Calendar calendar=Calendar.getInstance(); 
        int sendYear = calendar.get(Calendar.YEAR); 
        preferences.edit().putInt("saveNextYear",sendYear).putBoolean("saveBoolean",false) 
          .apply(); 
       } 
      } else { 
       Toast.makeText(context, "out of the period", Toast.LENGTH_LONG).show(); 
      } 
} 
} 

혼란 내 AlarmInitRec eiver :

public class AlarmInitReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Start~~~~TDU", Toast.LENGTH_LONG).show(); 

     SharedPreferences preferences = context.getSharedPreferences("time", context.MODE_PRIVATE); 
     long setTime = preferences.getLong("saveTime", 0); 

     Intent intentForSetTime = new Intent(context, PlayReceiver.class); 
     intentForSetTime.putExtra("msg", "play_hskay"); 

     PendingIntent pi = PendingIntent.getBroadcast(context, 1, intentForSetTime, PendingIntent.FLAG_ONE_SHOT); 

     AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     am.set(AlarmManager.RTC_WAKEUP, setTime, pi); 
    } 
} 
+1

아마도 이것은 사용자가 애플리케이션을 시작할 때마다'.putBoolean ("saveBoolean", true)'을 수행했기 때문일 것입니다. –

+0

죄송합니다. 다른 문제를 생각 나게하겠습니다. (해결책을 찾으려고 노력 중입니다. 지금 사용해보십시오. http://stackoverflow.com/questions/15061653/run-a-piece-of-code-only-once- 응용 프로그램이 설치되었을 때 –

+0

감사합니다 Andrii, 당신이 나에게 또 다른 문제를 상기시켜 주었고, 지금 그 링크에서 해결책을 찾았습니다. –

답변

1

아마도 사용자가 응용 프로그램을 시작할 때마다 .putBoolean("saveBoolean",true)을 수행했기 때문일 수 있습니다.