Question

I'm facing a little issue with my alarmManager. I'm trying to register an alarm to display a notification at spicified time. Here is how I'm doing it:

Utils.SetAlarm(this, Utils.GOODMORNING, 7, 0, 0); // so at 7:00

public static void SetAlarm(Context context, int req, int hour, int minute, int second) {
    AlarmManager am = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
    Intent intent = new Intent(context, myService.class);
    intent.putExtra(ACTION_REQUEST, req);
    PendingIntent pi = PendingIntent.getService(context, 0, intent, 0);

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, hour);
    calendar.set(Calendar.MINUTE, minute);
    calendar.set(Calendar.SECOND, second);

    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);
}

public class myService extends IntentService {
private static final int GOODMORNING_NOTIFICATION_REQUEST = 517;

public myService() {
    super("myService");
}

@Override
protected void onHandleIntent(Intent intent) {
    int extra = intent.getIntExtra(Utils.ACTION_REQUEST, 0);

    if (extra == Utils.GOODMORNING) {
        Notification notification = new Notification.Builder(this)
                .setContentTitle("title")
                .setContentText("content")
                .setSmallIcon(R.drawable.ic_launcher)
                .setAutoCancel(true)
                .build();

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        notificationManager.notify(GOODMORNING_NOTIFICATION_REQUEST, notification);
    }
}

The issue I'm facing is that the notifcation appear immediatly after i run the Utils.SetAlarm void. It will also appear fine at 7:00 am so it's apparently working but i wonder if someone known a way to avoid this problem. Thanks

Was it helpful?

Solution

your were facing notification appear immediatly after you run the Utils.SetAlarm void.because of 7:00 am may have complete in your device so it's appears working at that instance.so try to set alarm for next day when current time is greater than alarm time

try this

Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, hour);
    calendar.set(Calendar.MINUTE, minute);
    calendar.set(Calendar.SECOND, second);
long time=calendar.getTimeInMillis();

if(time<System.currentTimeMillis()){
    time=time+AlarmManager.INTERVAL_DAY;
}

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,time,
    AlarmManager.INTERVAL_DAY, alarmIntent);

OTHER TIPS

Use following code for your solution : and i used comments so you can easily understand

// time at which alarm will be scheduled here alarm is scheduled at 1
// day from current time,
// we fetch the current time in milliseconds and added 1 day time
// i.e. 24*60*60*1000= 86,400,000 milliseconds in a day
Long time = selectedMilli;

// create an Intent and set the class which will execute when Alarm
// triggers, here we have
// given AlarmReciever in the Intent, the onRecieve() method of this
// class will execute when
// alarm triggers and
// we will write the code to send SMS inside onRecieve() method pf
// Alarmreciever class

Intent intentAlarm = new Intent(ScheduleActivity1.this,
        AlarmReciever.class);

// create the object
AlarmManager alarmManager = (AlarmManager) this
        .getSystemService(Context.ALARM_SERVICE);

// set the alarm for particular time
alarmManager.set(AlarmManager.RTC_WAKEUP, time, PendingIntent
        .getBroadcast(this, i, intentAlarm,
                PendingIntent.FLAG_UPDATE_CURRENT));
/*
 * alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
 * time,TimeUnit.MINUTES.toMillis(1), PendingIntent.getBroadcast(this,
 * i, intentAlarm,PendingIntent.FLAG_UPDATE_CURRENT));
 */
// alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
// time,AlarmManager.INTERVAL_DAY, PendingIntent.getBroadcast(this, i,
// intentAlarm,PendingIntent.FLAG_UPDATE_CURRENT));
// Toast.makeText(ScheduleActivity1.this,
// "Alarm Scheduled for " + selectedMilli, Toast.LENGTH_LONG)
// .show();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top