2017-05-10 2 views
0

毎年5月8日から5月12日の間に1回だけ通知を送信したいと思います。通知を設定するには、毎年1回送信するだけですか?

しかし、私は別の年と比較し、それはその通知にユーザーがアプリケーションを起動したり、時間が5月8日5月12の間

であればそれはたくさんで私を混同だと再起動するたびに送信されます原因で立ち往生時間、いくつかの1つ私に問題を解決する方法を教えて、それは認められるだろう。

ありがとうございます。

私のマニフェスト:

<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> 

私の主な活動はbooleanyearを保存します:

//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: コード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:あなたは.putBoolean("saveBoolean",true)に、ユーザーがアプリケーションを起動するたびに行うため

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

おそらくこれがあります。

関連する問題