web-dev-qa-db-fra.com

Utilisation d'Alarmmanager pour démarrer un service à une heure précise

J'ai cherché beaucoup d'endroits mais je n'ai pas pu trouver une explication séquentielle claire de la façon de démarrer un service (ou si ce n'est pas possible alors une activité) à une heure spécifique quotidiennement en utilisant AlarmManager ??

Je souhaite enregistrer plusieurs de ces alarmes et leur déclenchement devrait entraîner le démarrage d'un service. Je vais avoir un petit morceau de code dans le service qui peut ensuite s'exécuter et je peux terminer le service pour de bon ....

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!!");

j'ai essayé ce code pour activer l'alarme à 4.45 ... mais ce n'est pas le service qui se déclenche ... dois-je continuer le processus en cours ?? Je fais quelque chose de mal ???

Encore une chose, mon service est parfaitement exécuté au cas où j'utiliserais le code suivant:

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

Salut les amis, Après beaucoup de recherches et en référence à la question de "Pentium10" sur le même sujet, j'ai réussi à le faire fonctionner. Bien que je ne comprenne toujours pas pourquoi le concept de "date" et l'objet Calendrier (non GregorianCalendar) que j'ai mentionné dans la question ne fonctionnent pas correctement.

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);
36
JaVadid
//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);

Ensuite, dans votre classe AlarmReciever qui est un broadcastReciever, sous la méthode onRecieve, mettez votre logique. Cela prendra en charge quelle que soit la logique que vous souhaitez gérer lorsque le moment sera venu à 19h20.

Si vous devez définir plusieurs alarmes, créez une autre instance de calendrier et définissez les valeurs d'heure de manière appropriée. Vous devez également créer une autre instance pour pendingIntent, sinon les temporisateurs se chevaucheront. Ensuite, réglez-le sur le même alarmManager avec un nouveau temporisateur et une instance en attente.

8
M P Mathugama

Vous pouvez lire le document à partir de 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);

// Réglez l'alarme pour qu'elle démarre à 8h30.

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

// setRepeating () vous permet de spécifier un intervalle personnalisé précis - dans ce cas, // 20 minutes.

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

Le code suivant devrait fonctionner correctement et il démarre le service @ 7:40 PM tous les jours. De plus, si l'appareil s'arrête, toutes vos alarmes sont annulées.

Assurez-vous de configurer toutes les alarmes une fois BOOT terminé.

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);
2
Prasanth.NVS

J'ai beaucoup essayé de démarrer le service à temps, donc j'ai une solution comme

  1. Calculez la différence entre heure actuelle et heure sélectionnée à partir du sélecteur de date "Return Long timeMileSec = Millisecondes" Différence

  2. après cela, créez un gestionnaire à l'intérieur et veillez si "Millisecondes" secondes

    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;
    
    }
    
1
sharma_kunal

les codes ci-dessus ne fonctionnaient pas et le code ci-dessous fonctionnait pour moi.

mois diminue 1. et heures 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
hassan karimi