简体   繁体   中英

Alarm Manager is triggered immediately in Android

Strangely, my Alarm Manger is calling the pending intent immediately, even though I have put a condition if the current time is greater than alarm time run one day later.

I have alarm Manger to trigger everyday at 10PM.

  Intent startServiceIntent = new Intent(this, numbers.class);
  this.startService(startServiceIntent);

            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(res.getString(R.string.hoursvalue))); //10
            cal.set(Calendar.MINUTE, 0);
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.AM_PM, Calendar.PM);
            cal.set(Calendar.MILLISECOND, 0);

            long alarmtime = cal.getTimeInMillis();

            Log.e("ALarm","Time"+alarmtime);

            if (currenttime > alarmtime)
            {
                alarmtime = alarmtime + AlarmManager.INTERVAL_DAY;
                Log.e("Current Time","Greater"+alarmtime);
            }

            if (currentapiVersion >= 19)
            {
                AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                Intent intent2 = new Intent(this, ServiceForLoadingOnlineNumbers.class);
                PendingIntent pi = PendingIntent.getService(this, 741258963, intent2, 0);
                am.setInexactRepeating(AlarmManager.RTC_WAKEUP, alarmtime, AlarmManager.INTERVAL_DAY, pi);
            }
            else if (currentapiVersion >= 16 && currentapiVersion < 19)
            {
                AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                Intent intent3 = new Intent(this, ServiceForLoadingOnlineNumbers.class);
                PendingIntent pi = PendingIntent.getService(this, 741258963, intent3, 0);
                am.setRepeating(AlarmManager.RTC_WAKEUP, alarmtime, AlarmManager.INTERVAL_DAY, pi);
            }

The Log shows the next day in milliseconds correctly but triggers immediately. What could be the issue here?

Try to use this way and let me know if you face any issues

    Date dat = new Date();// initializes to now
    Calendar cal_alarm = Calendar.getInstance();
    Calendar cal_now = Calendar.getInstance();
    cal_now.setTime(dat);

        Toast.makeText(mContext, "" + cal_now.getTime(), Toast.LENGTH_LONG)
                .show();
        ;
        cal_alarm.setTime(dat);
        cal_alarm.set(Calendar.HOUR_OF_DAY, 13);// set the alarm time
        cal_alarm.set(Calendar.MINUTE, 10);
        cal_alarm.set(Calendar.SECOND, 10);
        if (cal_alarm.before(cal_now)) {// if its in the past increment
            cal_alarm.add(Calendar.DATE, 1);
        }

I suggest checking if the alarm manager is null then canceling the alarm before setting the alarm this took me some time example

if(alarmManger != null){
    alarmManger.cancel(operation);
    alarmManger.setRepeating(alarmType,alarmtime,‌​AlarmManager.INTERVAL_DAY, operation);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM