Using Alarmmanager to start a service at specific time

倖福魔咒の 提交于 2019-11-25 19:10:49

HI friends, After a lot of researching and with reference from "Pentium10"'s question on the same topic i managed to get it working. Though i still cant understand why the "date" concept and the Calendar(non GregorianCalendar) object which i have mentioned in the question are not working correctly.

Calendar cur_cal = new GregorianCalendar();
cur_cal.setTimeInMillis(System.currentTimeMillis());//set the current time and date for this calendar

Calendar cal = new GregorianCalendar();
cal.add(Calendar.DAY_OF_YEAR, cur_cal.get(Calendar.DAY_OF_YEAR));
cal.set(Calendar.HOUR_OF_DAY, 18);
cal.set(Calendar.MINUTE, 32);
cal.set(Calendar.SECOND, cur_cal.get(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cur_cal.get(Calendar.MILLISECOND));
cal.set(Calendar.DATE, cur_cal.get(Calendar.DATE));
cal.set(Calendar.MONTH, cur_cal.get(Calendar.MONTH));
Intent intent = new Intent(ProfileList.this, IntentBroadcastedReceiver.class);
PendingIntent pintent = PendingIntent.getService(ProfileList.this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent);
//Create alarm manager
AlarmManager alarmMgr0 = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

//Create pending intent & register it to your alarm notifier class
Intent intent0 = new Intent(this, AlarmReciever.class);
PendingIntent pendingIntent0 = PendingIntent.getBroadcast(this, 0, intent0, 0);

//set timer you want alarm to work (here I have set it to 7.20pm)
Intent intent0 = new Intent(this, OldEntryRemover.class);
Calendar timeOff9 = Calendar.getInstance();
timeOff9.set(Calendar.HOUR_OF_DAY, 19);
timeOff9.set(Calendar.MINUTE, 20);
timeOff9.set(Calendar.SECOND, 0);

//set that timer as a RTC Wakeup to alarm manager object
alarmMgr0.set(AlarmManager.RTC_WAKEUP, timeOff0.getTimeInMillis(), pendingIntent0);

Then in your AlarmReciever class which is a broadcastReciever, under onRecieve method put your logic. This will take care of what ever the logic you want to handle when the time comes to 7.20 pm.

If you need to set multiple alarms, create another Calendar instance & set time values appropriately. You also need to create another instance for pendingIntent otherwise timers will overlap. Then set it to same alarmManager with new timer & pendingIntent.

You can read document from https://developer.android.com/training/scheduling/alarms.html

private AlarmManager alarmMgr;
private PendingIntent alarmIntent;

alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

// Set the alarm to start at 8:30 a.m.

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 30);

// setRepeating() lets you specify a precise custom interval--in this case, // 20 minutes.

alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
        1000 * 60 * 20, alarmIntent);
Prasanth.NVS

The following code should work fine and it starts the service @ 7:40 PM every day. Also, if device shuts down then all your alarms get cancelled.

Make sure to set up all the alarms after BOOT is completed.

Intent slIntent = new Intent(this, x.class);

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 19);
calendar.set(Calendar.MINUTE, 40);
calendar.set(Calendar.SECOND, 0);

PendingIntent slPendingIntent = PendingIntent.getService(this, 1, slIntent, PendingIntent.FLAG_ONE_SHOT);

AlarmManager alarmManager=(AlarmManager) getSystemService(Context.ALARM_SERVICE);

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                          AlarmManager.INTERVAL_DAY, slPendingIntent);
sharma_kunal

I tried a lot To Start Service on Time So I Have one solution like

  1. Calculate the difference between current time and selected time from date picker "Return Long timeMileSec = Milliseconds" Difference

  2. after this create a handler inside it and Sleep if "Milliseconds" seconds

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            CreateService();
            getActivity().startService(intentServiceObj);
        }
    }, timeMileSec);
    
    
    // Below is the service Methods.
    private void CreateService() {
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(System.currentTimeMillis());
    
        cal.add(Calendar.DAY_OF_YEAR, year);
        cal.set(Calendar.HOUR_OF_DAY, hourScreen);
        cal.set(Calendar.MINUTE, minuteScreen);
    
        // cal.setTimeInMillis(timeselectedmillisecond);
    
        Intent intent = new Intent(getActivity(),
            ServiceDailyLocationUpdate.class);
        pintent = PendingIntent.getService(getActivity(), 0, intent, 0);
    
        alarm = (AlarmManager) getActivity().getSystemService(
            Context.ALARM_SERVICE);
    
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.HOUR, 86000 * 1000,
            pintent);
    
    }
    
    // Return Differnce between two date
    private long calculateDateDiffSecond(String firstDate, String secondDate) {
    
        long numberOfDays = 0;
    
        String dateStart = firstDate;
        String dateStop = secondDate;
    
        Date d1 = null;
        Date d2 = null;
    
        try {
            d1 = sdfTime.parse(dateStart);
            d2 = sdfTime.parse(dateStop);
    
            // in milliseconds
            long diff = d2.getTime() - d1.getTime();
    
            long diffSeconds = diff / 1000 % 60;
            long diffMinutes = diff / (60 * 1000) % 60;
            long diffHours = diff / (60 * 60 * 1000) % 24;
            long diffDays = diff / (24 * 60 * 60 * 1000);
    
            System.out.print(diffDays + " days, ");
            System.out.print("Hours::" + diffHours + " hours, ");
            System.out.print("HoursMinute::" + diffMinutes + " minutes, ");
            System.out.print(diffSeconds + " seconds.");
            numberOfDays = diffDays;
            numberOfDays = diff;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return numberOfDays;
    
    }
    
hassan karimi

codes above didn't work and below code worked for me.

month decreases 1. and hours 0-11.

int day = ff.getGregorianDay() ;
int month = ff.getGregorianMonth() ;
int year = ff.getGregorianYear();
int hour = TimePicker1.getCurrentHour();
int minute = TimePicker1.getCurrentMinute();

Calendar cal_alarm = Calendar.getInstance(); 
cal_alarm.setTimeInMillis(System.currentTimeMillis() );
cal_alarm.set(Calendar.YEAR, year);
cal_alarm.set(Calendar.MONTH, month-1);
cal_alarm.set(Calendar.DAY_OF_MONTH, day);


cal_alarm.set(Calendar.AM_PM, Calendar.AM );
cal_alarm.set(Calendar.HOUR, hour);

if( hour >= 12){
    cal_alarm.set(Calendar.AM_PM, Calendar.PM );
    cal_alarm.set(Calendar.HOUR, hour-12);
} 
cal_alarm.set(Calendar.MINUTE, minute );
cal_alarm.set(Calendar.SECOND, 0 );

Intent myIntent = new Intent(YadavariNewActivity.this, Alarm_Sag.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(YadavariNewActivity.this, 0, myIntent,0);

AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set( AlarmManager.RTC_WAKEUP, cal_alarm.getTimeInMillis(),  pendingIntent);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!