Android evita el disparo inmediato del servicio de alarma si ha pasado la hora de la alarma del día

La referencia para Alarm Manager dice que

Si el tiempo de activación indicado está en el pasado, la alarma se activará inmediatamente.

Estoy enfrentando este problema en mi aplicación. Aquí está mi código de administrador de alarma:

Intent myIntent = new Intent(getActivity(), DinnerAlarmReceiver.class); pendingDinnerIntent = PendingIntent.getBroadcast(getActivity(), 0, myIntent, 0); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); calendar.set(Calendar.MINUTE, minute); alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingDinnerIntent); 

¿Hay alguna solución a este problema?

—–EDITAR——

He escrito un código para estimar si el tiempo establecido para la alarma es anterior a la hora actual. Aquí está la porción de arriba con los cambios correspondientes:

 Calendar calendar = Calendar.getInstance(); long currentTime = calendar.getTimeInMillis(); calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); calendar.set(Calendar.MINUTE, minute); long setTime = calendar.getTimeInMillis(); Timestamp setTimestamp = new Timestamp(setTime); Timestamp currentTimestamp = new Timestamp(currentTime); if (setTimestamp.after(currentTimestamp)) { alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingDinnerIntent); } else { } 

¿Qué debo alarmManager con alarmManager en caso de que setTimestamp sea ​​anterior a currentTimestamp ?

    No es necesario crear s Timestamp . Puedes hacerlo con tu Calendar .

     Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); calendar.set(Calendar.MINUTE, minute); if(calendar.before(Calendar.getInstance())) { calendar.add(Calendar.DATE, 1); } alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingDinnerIntent); 

    También mencionaría que a partir de KitKat, si su targetSdkVersion es 19 o superior, el AlarmManager#set() no es exacto. Si desea que su alarma se dispare en un momento exacto, deberá usar un setExact*() .