Использование Alarmmanager для запуска службы в определенное время - PullRequest
25 голосов
/ 16 июня 2010

Я искал много мест, но не смог найти четкое последовательное объяснение того, как запускать службу (или, если это невозможно, то действие) в определенное время ежедневно с помощью AlarmManager ??

Я хочу зарегистрировать несколько таких аварийных сигналов, и их запуск должен привести к запуску службы. У меня будет небольшой кусочек кода в сервисе, который затем можно будет выполнить, и я смогу закончить сервис навсегда ....

Calendar cal = Calendar.getInstance();
Calendar cur_cal = Calendar.getInstance();
cur_cal.setTimeInMillis(System.currentTimeMillis());
Date date = new Date(cur_cal.get(Calendar.YEAR), cur_cal.get(Calendar.MONTH), cur_cal.get(Calendar.DATE), 16, 45);
cal.setTime(date);
Intent intent = new Intent(ProfileList.this, ActivateOnTime.class);
intent.putExtra("profile_id", 2);
PendingIntent pintent = PendingIntent.getService(ProfileList.this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pintent);
System.out.println("The alarm set!!");

Я попытался этот код активировать сигнал тревоги в 4.45 ... но он не запускает службу ... я должен держать процесс запущенным ?? М, я делаю что-то не так ???

Еще одна вещь, мой сервис прекрасно работает, если я использую следующий код:

long firstTime = SystemClock.elapsedRealtime();
alarm.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 30*1000,pintent);

Ответы [ 6 ]

36 голосов
/ 17 июня 2010

Привет, друзья, после долгих исследований и со ссылкой на вопрос "Pentium10" по той же теме мне удалось заставить его работать.Хотя я до сих пор не могу понять, почему концепция «дата» и объект «Календарь» (не GregorianCalendar), о котором я упоминал в этом вопросе, работают неправильно.

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);
8 голосов
/ 25 мая 2012
//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);

Затем в вашем классе AlarmReciever, который является broadcastReciever, под методом onRecieve поместите свою логику.Это позаботится о том, какую логику вы хотите обработать, когда придет время в 19 ч. 20 м.

Если вам нужно установить несколько будильников, создайте другой экземпляр календаря и установите значения времени соответствующим образом.Вам также нужно создать другой экземпляр для pendingIntent, иначе таймеры будут перекрываться.Затем установите его в то же AlarmManager с новым таймером и pendingIntent.

4 голосов
/ 14 апреля 2015

Вы можете прочитать документ из 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);

// Установить будильник на 8:30 утра

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

// setRepeating () позволяет указатьточный пользовательский интервал - в этом случае // 20 минут.

alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
        1000 * 60 * 20, alarmIntent);
2 голосов
/ 31 марта 2017

Следующий код должен работать нормально, и он запускает службу каждый день в 19:40. Кроме того, если устройство выключается, все ваши тревоги отменяются.

Обязательно настройте все аварийные сигналы после завершения загрузки.

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);
1 голос
/ 31 октября 2015

коды выше не работали, а ниже код работал для меня.

месяц уменьшается 1. и часы 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);
1 голос
/ 12 июля 2014

Я много пытался запустить сервис вовремя, поэтому у меня есть одно решение, например

  1. Рассчитайте разницу между текущим временем и выбранным временем от средства выбора даты "Return Long timeMileSec = Milliseconds" Разница

  2. после этого создайте внутри него обработчик и переведите его в спящий режим, если «миллисекунды» секунд

    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;
    
    }
    
...