IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

AlarmManager et gestion d'alarme hébdomadaire


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut AlarmManager et gestion d'alarme hébdomadaire
    Bonjour,

    je suis entrain d'essayer de mettre au point un système d'alarme hebdomadaire permettant a une personne d'avoir une notification au jour et à l'heure choisie (chaque semaine).


    Voici ce que j'ai déjà mis en place. J'ai une Custom ListView qui affiche des objets d'une classe que j'ai créée (AlarmeObject)
    Chaque ligne de ma liste view contient. Une checkBox avec le nom du jour et un textView qui lorsque l'on clique dessus ouvre un TimePickerDialog permettant de choisir l'heure de l'alarme.

    La sélection d'un jour ou d'une heure dans cette liste modifie automatiquement l'objet AlarmeObject associé.
    Capture d'écran de mon Activity (Alarme.java)

    Nom : Capture.PNG
Affichages : 1186
Taille : 147,2 Ko

    Dans la class Alarme j'ai un adapter qui crée ma listView et un OnClickListener sur le bouton Validate.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    btnValide.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /* on annulle avec tout chose les alarmes*/
                    alarmManager.cancel(pendingIntent);
                    for (int i = 0; i < alarmeObjectArrayList.size(); i++){
                        //on récupère l'alarme qu'elle soit validée ou non
                        AlarmeObject alm = alarmeObjectArrayList.get(i);
     
                        /*  on cherche gra^ce au if si elle est validée ou non */
                        if(alm.getAlarmeStatus() == true){
                            /* dans le cas ou elle est valide on la fixe */
                            //setAlarme(alm);
     
                            int hour = alm.getAlarmeHour();
                            int minutes = alm.getAlarmeMin();
                            int jour = alm.getInt_id();
     
                            Calendar calendar = Calendar.getInstance();
                            //calendar.setTimeInMillis(System.currentTimeMillis());
                            calendar.set(calendar.DAY_OF_WEEK, jour);
                            calendar.set(calendar.HOUR_OF_DAY, hour);
                            calendar.set(calendar.MINUTE, minutes);
                            calendar.set(calendar.SECOND, 0);
     
                            /*Création du prending intent qui est en fait l'alarme Receiver qui permet d'écouter
                             l'application et de savoir quand l'alarme doit se déclancher, grâce à la classe AlarmeReceiver.java
     
                             on met jour dans l'identifiant de manière à ce que l'alarme manager ne confonde pas les alarmes*/
                            pendingIntent = PendingIntent.getBroadcast(getBaseContext(), jour, intentToLaunch,0);
     
                            /* on set l'alarme ici*/
                            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY*7, pendingIntent);
     
                            /* Une fois le bouton clické on retourne sur l'accueil */
                            Intent intent_validate = new Intent(Alarme.this, Accueil.class);
                            intent_validate.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                            startActivity(intent_validate);
                            finish();
     
                        }//if(alm.getAlarmeStatus() == true)
                    }//for(int i = 0; i < alarmeObjectArrayList.size(); i++)
                }
            });
    Ce code est sensé me permettre de passer toute la listView grâce au for et pour chaque alarme sélectionnée de valider et mettre en place une alarme.

    Ici mon BroadCast Reciever


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class AlarmReceiver extends BroadcastReceiver {
     
        @Override
        public void onReceive(Context context, Intent intent) {
     
            // Lancement du service de notification
            Intent service1 = new Intent(context, MyAlarmeService.class);
            context.startService(service1);
        }
    }

    et enfin mon Service pour la notification

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    public class MyAlarmeService extends Service{
     
        @Override
        public void onCreate() {
            super.onCreate();
     
        }
     
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
     
     
     
        @Override
        public void onStart(Intent intent, int startId) {
            super.onStart(intent, startId);
     
            NotificationManager n = (NotificationManager) this.getApplicationContext().getSystemService(NOTIFICATION_SERVICE);
            Intent intentToLaunch = new Intent(this.getApplicationContext(), Accueil.class);
            //evite à l'intent de se recréer une fois si l'application est déjà en marche
            intentToLaunch.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            PendingIntent pendingIntent = PendingIntent.getActivity(this.getBaseContext(), startId, intentToLaunch, PendingIntent.FLAG_UPDATE_CURRENT);
     
            Notification.Builder notif = new Notification.Builder(getBaseContext())
                    .setAutoCancel(true)
                    .setSmallIcon(R.drawable.ic_launcher2)
                    .setContentTitle("Entraînement")
                    .setVibrate(new long[]{1000, 1000, 1000})
                    .setLights(Color.GREEN, 3000, 3000)
                    .setSound(Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.notif_sound))
                    .setContentIntent(pendingIntent);
            n.notify(0, notif.build());
     
        }
     
        @Override
        public void onDestroy() {
            super.onDestroy();
        }
    Voilà, mon souci ou plutôt mes deux soucis.

    1) J'aimerai que mes alarmes soient sauvegardée dans mon application et pas qu'elle ne s'effacent lorsque l'appareil s'éteint ou que l'application est tuée
    2) J'aimerai que mes notifications fonctionnent correctement, car parfois elles apparaissent plusieurs fois.


    Si des gens m'ont compris et peuvent m'aider je leur serait vraiment reconnaissant.

    Merci d'avance

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    1)

    Normalement cela fonctionne si l'application n'est pas chargée... (c'est l'intérêt du BroadcastReceiver, si il est bien renseigné dans le manifest).
    Par contre, les données de l'AlarmManager ne resistent pas à un reboot. Il faut donc que le programme soit notifié d'une fin de boot, et réinitialise les "alarmes".

    D’où au passage l'intérêt de coller le code qui passe des données de l'application aux alarmes dans une fonction à part.
    (un onClick ne devrait faire que 2/3 lignes de code pas plus, si plus de code dedans, il y aura probablement un soucis de "refactoring" à un moment).

    Donc on a à priori 3 fonctions:
    Stockage local (preferences, database, fichier simple...) ==> MEMOIRE (alarmeObjectArrayList)
    MEMOIRE (alarmeObjectArrayList) ==> AlarmManager
    MEMOIRE (alarmeObjectArrayList) ==> Stockage local (preferences, database, fichier simple...)


    2)

    Je pense que ce qui pose problème... est qu'il n'y a pas de test pour savoir si on est dans le futur... et j'ai peur que les alarm programmées dans le passé ne fonctionnent immédiatement...
    Rajouter un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Date now = new Date();
    while (calendar.getTime().before(now)) calendar.add(Calendar.DAY,7);

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    je te remercie déjà pour les précisions que tu apporte. J'étais justement entrain de construire un petite base de données avec laquelle je pourrais stocker mes alarmes. Une fois que la personne a valider les alarmes, je peux ainsi les enregistrer dans la base de données et mettre en route celle qui on été choisies. Il me faut maintenant faire une fonction qui annule mes alarmes (ou cas ou une personne souhaite changer de jour) et une pour valider les alarmes au cas ou le téléphone a été éteint.

    Est-ce que tu sais, si j'ai meilleur temps de valider toutes les alarmes en une fois ou alors je check chaque alarme par rapport au temps et je valide seulement la suivante (celle qui se trouve le plus proche dans le temps) ?

Discussions similaires

  1. Programme de gestion d'alarmes
    Par Zetmurin dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 16/01/2011, 14h25
  2. [A-07] Base de donnée de gestion d'alarmes
    Par jon08 dans le forum Modélisation
    Réponses: 16
    Dernier message: 30/11/2008, 17h44
  3. gestion d'alarme par SMS
    Par kitsune dans le forum Développement
    Réponses: 2
    Dernier message: 19/07/2005, 12h31
  4. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11
  5. gestion d'un joystick ...
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo