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)
Dans la class Alarme j'ai un adapter qui crée ma listView et un OnClickListener sur le bouton Validate.
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.
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++) } });
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
Voilà, mon souci ou plutôt mes deux soucis.
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(); }
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
Partager