Ilyos Ibrokhimov
Ilyos Ibrokhimov

Reputation: 175

setRepeating() function is not workingproperly (AlarmManger Android)

I was using setRepeating() function to schedule events in my Application. According to Android documentation setRepeating() is not exact from API level 19+.In the app, when it is time to alarm (every day at 23:59) broadcast receiver is called. However, this broadcast receiver is being called too early(ex: sometimes it is being called right after I set the alarm although there are more than 10 hours until 23:00)

Here is my code:

set Alarm function:

public void setEmaResetAlarm(Context context) { alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManagerMorning = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    intentResetNight = new Intent(context, EMAAlarmRcvr.class);
    intentResetNight.putExtra("ema_reset_night", true); //time to reset EMA to 0

    intentResetMorning = new Intent(context, EMAAlarmRcvr.class);
    intentResetMorning.putExtra("ema_reset_morning", true); //time to reset EMA to 0

    intentRemove = new Intent(context, EmaDismissReceiver.class);
    intentRemove.putExtra("ema_pop_up_remove", true); // time to remove EMA pop up


    pendingIntentResetNight = PendingIntent.getBroadcast(context, 10, intentResetNight, PendingIntent.FLAG_UPDATE_CURRENT);
    pendingIntentResetMorning = PendingIntent.getBroadcast(context, 8, intentResetMorning, PendingIntent.FLAG_UPDATE_CURRENT);
    pendingIntentRemove = PendingIntent.getBroadcast(context, 11, intentRemove, PendingIntent.FLAG_UPDATE_CURRENT);

    if (alarmManager == null || alarmManagerMorning == null)
        return;


    emaTimeSubscription = context.getSharedPreferences("SubscriptionCheck", Context.MODE_PRIVATE);
    int hour1 = Integer.parseInt(emaTimeSubscription.getString("hours1", null));
    int hour2 = Integer.parseInt(emaTimeSubscription.getString("hours2", null));
    int hour3 = Integer.parseInt(emaTimeSubscription.getString("hours3", null));


    Calendar firingCallReset = Calendar.getInstance();
    firingCallReset.set(Calendar.HOUR_OF_DAY, 23); // at 11:59pm
    firingCallReset.set(Calendar.MINUTE, 59); // Particular minute
    firingCallReset.set(Calendar.SECOND, 0); // particular second
    firingCallReset.set(Calendar.MILLISECOND, 0); // particular second
    //alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firingCallReset.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntentResetNight);


    Calendar firingCalResetMorning = Calendar.getInstance();
    firingCalResetMorning.set(Calendar.HOUR_OF_DAY, 9); // at 9:30am
    firingCalResetMorning.set(Calendar.MINUTE, 30); // Particular minute
    firingCalResetMorning.set(Calendar.SECOND, 0); // particular second
    firingCalResetMorning.set(Calendar.MILLISECOND, 0); // particular second
    //alarmManagerMorning.setRepeating(AlarmManager.RTC_WAKEUP, firingCalResetMorning.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntentResetMorning);


    //remove EMA pop up
    Calendar firingCalRemove11 = Calendar.getInstance();
    firingCalRemove11.set(Calendar.HOUR_OF_DAY, hour1 + 1); // at 11:01am
    firingCalRemove11.set(Calendar.MINUTE, 1); // Particular minute
    firingCalRemove11.set(Calendar.SECOND, 0); // particular second
    firingCalRemove11.set(Calendar.MILLISECOND, 0); // particular second
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firingCalRemove11.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntentRemove);

    Calendar firingCalRemove15 = Calendar.getInstance();
    firingCalRemove15.set(Calendar.HOUR_OF_DAY, hour2 + 1); // at 3:01pm
    firingCalRemove15.set(Calendar.MINUTE, 1); // Particular minute
    firingCalRemove15.set(Calendar.SECOND, 0); // particular second
    firingCalRemove15.set(Calendar.MILLISECOND, 0); // particular second
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firingCalRemove15.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntentRemove);

    Calendar firingCalRemove19 = Calendar.getInstance();
    firingCalRemove19.set(Calendar.HOUR_OF_DAY, hour3 + 1); // at 7:01pm
    firingCalRemove19.set(Calendar.MINUTE, 1); // Particular minute
    firingCalRemove19.set(Calendar.SECOND, 0); // particular second
    firingCalRemove19.set(Calendar.MILLISECOND, 0); // particular second
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firingCalRemove19.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntentRemove);


}

BroadcastReceiver to be called:

public class EMAAlarmRcvr extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    SharedPreferences loginPrefs = context.getSharedPreferences("UserLogin", MODE_PRIVATE);

    SharedPreferences configPrefs = context.getSharedPreferences("Rewards", MODE_PRIVATE);




     //For resetting  ema prefr (11:59 PM ) and (9:30 AM )
    if (intent.getBooleanExtra("ema_reset_night", false) || intent.getBooleanExtra("ema_reset_morning", false)) {
        SharedPreferences.Editor ema_editor = configPrefs.edit();
        SharedPreferences.Editor hrm_editor = configPrefs.edit();

        Log.e("TAG", "onReceive: TaskManager" );

        hrm_editor.putBoolean("hrm_completed", false);
        hrm_editor.apply();
        ema_editor.putBoolean("ema1_answered", false);
        ema_editor.putBoolean("ema2_answered", false);
        ema_editor.putBoolean("ema3_answered", false);

        ema_editor.putInt("ema_answered_count", 0);
        ema_editor.apply();

        SharedPreferences.Editor loginEditor = loginPrefs.edit();
        loginEditor.putBoolean("ema_btn_make_visible", false);
        loginEditor.apply();

    }

    

}

}

Upvotes: 1

Views: 134

Answers (1)

Cătălin Florescu
Cătălin Florescu

Reputation: 5158

Before setting a new alarm you should cancel any previous alarms as:

alarmManager.cancel(pendingIntent);

Also, use same pending intent that you use to create a new alarm to cancel old set one because is used as unique identifier, so:

// cancel old alarm
alarmManager.cancel(pendingIntentRemove);
// then create new one
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firingCalRemove11.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntentRemove);

You get called at random times because is created a new alarm

Upvotes: 0

Related Questions