Andhadhundh Pitaii
Andhadhundh Pitaii

Reputation: 55

Alarm is running immediately after it is created

I am trying to play a ringtone at exactly at 7 PM everyday but it is playing ringtone immediately after its pending intent is registering broadcast.

I called the service in the foreground on a button click and created pending intent there in onStartCommand:

@Override
public int onStartCommand(Intent intent, int flags, int startId) 
{

    startForeground(FOREGROUND_ID,
            buildForegroundNotification("DummyApp"));

    c = Calendar.getInstance();
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    int interval = 1000 * 60 * 60*24;
    c.setTimeInMillis(System.currentTimeMillis());
    c.set(Calendar.HOUR, 19);
    c.set(Calendar.MINUTE,00);
    manager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),
            interval, pendingIntent);
    Intent alarmIntent = new Intent(AlarmService.this, DataProcessor.class);
    pendingIntent = PendingIntent.getBroadcast(AlarmService.this, 0,
            alarmIntent, 0);
    return START_STICKY;
}

Now I am playing a ringtone on receiving this broadcast in DataProcessor class the on Receive method of Data Processor class:

@Override
public void onReceive(Context ctx,Intent intent) {


    playRIng(ctx);

 }

But when I run this code,click the button,service is created but alarm is fired immediately after the AlarmService is called and ringtone is played also.How it is possible because I am giving the exact 7 O clock time when registering broadcast.? Googled a lot but found the same code only and nothing else.Every code is able to play the ringtone on the time but it also plays the ringtone immediately after the broadcast is registered.

Upvotes: 5

Views: 1660

Answers (4)

Vijay Singh
Vijay Singh

Reputation: 320

Best way, Play with hour & mintue.

Note: Please check your time formate. In my case it's 24 hr formate

Example:

     Calendar c = Calendar.getInstance();
   //for 12 hr formate user int hour = c.get(Calendar.HOUR);
    int hour = c.get(Calendar.HOUR_OF_DAY);
    int minute = c.get(Calendar.MINUTE);
    //Log.e("time",""+hour+":"+minute);

    if (hour == 10 && minute == 0 ) {

     }

Upvotes: 0

Anarkali
Anarkali

Reputation: 36

You can try the example at developers website understanding the samplecode available there.May be there is some programming mistake in your code but the sample code available there is working exactly you want.

Scheduling Repeating Alarms

Upvotes: 0

Mike
Mike

Reputation: 2593

If you ran that code at 9pm you would be telling the AlarmManager that the intent should have been run for the first time 2 hours ago.

You need to check if the Calendar time is behind the current time.
If it is you need to add a day to the calendar so that it first triggers tomorrow at 7pm.

Something like this might work:

    c = Calendar.getInstance();
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    int interval = 1000 * 60 * 60 * 24;
    // Not needed
    // c.setTimeInMillis(System.currentTimeMillis());
    c.set(Calendar.HOUR, 19);
    c.set(Calendar.MINUTE, 00);

    // ** Add this **
    // Check if the Calendar 7pm is in the past
    if (c.getTimeInMillis() < System.currentTimeMillis())
        c.add(Calendar.DAY_OF_YEAR, 1); // It is so tell it to run tomorrow instead

    manager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), interval, pendingIntent);
    Intent alarmIntent = new Intent(AlarmService.this, DataProcessor.class);
    pendingIntent = PendingIntent.getBroadcast(AlarmService.this, 0, alarmIntent, 0);

Upvotes: 2

Alejandro Cumpa
Alejandro Cumpa

Reputation: 2353

Why you don't use a condition?:

@Override
public void onReceive(Context ctx,Intent intent) {
Calendar c = Calendar.getInstance(); 
 int hour = c.get(Calendar.HOUR);

if(hour==19) 
 {
    playRIng(ctx);
 }

 }

Upvotes: 2

Related Questions