Как настроить отправку уведомлений раз в год?

Я хочу отправить уведомление, когда время между 8 мая и 12 мая, только один раз в год.

Но я застрял в сравнении с другим годом, потому что это будет отправлять уведомление каждый раз, когда пользователь запускает приложение или перезагружается, если время находится между 8 и 12 мая.

Меня смущает много часов, кто-нибудь может научить меня, как решить проблему, это будет оценено.

Заранее спасибо.

Мои манифесты:

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

Моя основная деятельность сохранит boolean и year:

//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();
            }
}
}

Мой AlarmInitReceiver:

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);
    }
}

person Morton    schedule 10.05.2017    source источник
comment
Вероятно, это потому, что вы делаете .putBoolean("saveBoolean",true) каждый раз, когда пользователь запускает приложение.   -  person Andrii Omelchenko    schedule 10.05.2017
comment
К сожалению, вы напоминаете мне еще одну проблему :(, я работаю над ней, пытаюсь найти решение, я пробую сейчас stackoverflow.com/questions/15061653/   -  person Morton    schedule 10.05.2017
comment
Спасибо, Андрей, ты напомнил мне о другой проблеме, и сейчас я нахожу решение по этой ссылке.   -  person Morton    schedule 10.05.2017
comment
Пожалуйста!   -  person Andrii Omelchenko    schedule 10.05.2017


Ответы (1)


Вероятно, это потому, что вы делаете .putBoolean("saveBoolean",true) каждый раз, когда пользователь запускает приложение.

person Andrii Omelchenko    schedule 10.05.2017