2010-06-16 2 views
22

Я искал много мест, но не смог найти чистое последовательное объяснение того, как запустить службу (или, если это невозможно, активность) в определенное время ежедневно с помощью AlarmManager ??Использование 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 ... но его не увольняют службу ... мне нужно, чтобы процесс работал? M я делаю что-то неправильно ???

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

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

возможно дубликат [Как установить сигнализацию, чтобы правильно стрелять в установленное время?] (Http://stackoverflow.com/questions/2992882/how-to-set-an-alarm-to-fire- правильно-в-фиксированном времени) – Pentium10

+1

Я проверил ур вопрос «Pentium10» и я spose его схожую, но нашел ли u решение для того же ??? – JaVadid

ответ

30

Привет друзья, После большого исследования и со ссылкой из «Pentium10» 's вопрос на том же тема мне удалось заставить его работать. Хотя я все еще не могу понять, почему концепция «дата» и объект Calendar (non 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); 
+0

В этом коде будильник начинается в 18:32 того же дня, не так ли? – Sver

+0

Попробуйте использовать объект Time, а также, согласно документации, этот сигнал начнется в 18:32 UTC – gregm

+0

@JaVadid: У меня такой же вопрос, пожалуйста, помогите мне в этом. Вот он: http://stackoverflow.com/questions/10039593/android-alarm-to-be-play-every-30-minutes-and-it-start-from-1230/10039699#10039699 –

7
//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 поставить логику. Это позаботится о том, какую логику вы хотите обработать, когда придет время до 7:20 вечера.

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

+3

Какова логика использования широковещательного приемника здесь? Я имею в виду, если вы хотите что-то сделать (например, получить температуру), запуск службы должен выполнять эту работу, не так ли? – MSaudi

+0

Действительно, услуга будет лучшим выбором, если «логика» больше, чем показ тоста. Кроме того, можно было бы именовать переменные. – Entalpi

1

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

  1. Вычислить разницу между текущее время и время, выбранное от выбора даты «Возвращение Long timeMileSec = Миллисекунды "Разница

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

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

коды не работают для меня.

и этот код работают для меня.

моли указывается 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); 
+0

Что такое ff здесь? –

+0

- изготовленный под заказ класс. имеет год и день. @ umar-ata –

+0

почему бы вам не добавить его в свой ответ –

0

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

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

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); 
Смежные вопросы