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