Bonjour à tous,
je développe une application qui permet de programmer le lancement d'un service à une date et heure précise et d'effectuer certaines taches de fond.
Pour cela j'ai une activité (MainActivity) qui me permet de gérer l'interface graphique et contient la méthode (planifierAlarm) pour paramétrer la class AlarmReceiver, un Service (MyService) et une class AlarmReceiver.
(Code trouvé sur un autre site)
MainActivity :
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 ... private void planifierAlarm() { //Récupération de l'instance du service AlarmManager. AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); //On instancie l'Intent qui va être appelé au moment du reveil. Intent intent = new Intent(this, AlarmReceiver.class); //On créer le pending Intent qui identifie l'Intent de reveil avec un ID et un/des flag(s) PendingIntent pendingintent = PendingIntent.getBroadcast(this, ALARM_ID, intent, 0); //On annule l'alarm pour replanifier si besoin am.cancel(pendingintent); if(alarm.isActive()){ //on va déclencher un calcul pour connaitre le temps qui nous sépare du prochain reveil. Calendar reveil = Calendar.getInstance(); reveil.set(Calendar.HOUR_OF_DAY, alarm.getHeure().hour); reveil.set(Calendar.MINUTE, alarm.getHeure().minute); if(reveil.compareTo(Calendar.getInstance()) == -1) reveil.add(Calendar.DAY_OF_YEAR, 1); Calendar cal = Calendar.getInstance(); reveil.set(Calendar.SECOND, 0); cal.set(Calendar.SECOND, 0); long diff = reveil.getTimeInMillis() - cal.getTimeInMillis(); //On ajoute le reveil au service de l'AlarmManager am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis() + diff, pendingintent); Toast.makeText(this, "Alarme programmé le " + reveil.get(Calendar.DAY_OF_MONTH) + " à " + reveil.get(Calendar.HOUR_OF_DAY) + ":" + reveil.get(Calendar.MINUTE), Toast.LENGTH_SHORT).show(); } } ...
AlarmReceiver :
Mon problème est que lorsque je programme le lancement du service via l'AlarmReceiver, au moment du lancement, j'ai une erreur du type :
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 ... @Override public void onReceive(Context context, Intent intent) { connection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { myService = (MyService) ((MyService.BackgroundServiceBinder)service).getService(); //appel de la méthode (plus bas) onServiceAvailable(); } public void onServiceDisconnected(ComponentName name) { myService = null; } }; Intent serviceIntent = new Intent(context, MyService.class); context.startService(serviceIntent); context.bindService(intent,connection, Context.BIND_AUTO_CREATE); } public void onServiceAvailable() { //Ici je veux accéder aux méthodes du service pour exécuter certaines taches en fond. //ex. myService.sauvegardeParametres(); } ...
IntentReceiver components are not allowed to bind to services
j'ai essayé de supprimer le bind entre la class AlarmReceiver et le service et je n'ai effectivement plus d'erreur. Le service se lance correctement (je le vois dans les Log).
mais malheureusement je ne peux pas appeler les méthodes qui se trouvent dans le service à partir de AlarmReceiver.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 @Override public void onReceive(Context context, Intent intent) { Intent serviceIntent = new Intent(context, MyService.class); context.startService(serviceIntent); }
J'ai d'autres Activités qui se connectent au même service et je souhaite pouvoir programmer le lancement d'un nombre défini de méthodes de ce service.
J'ai lu quelque part qu'il n'était pas possible de connecter un Receiver à un service, car celui-ci n'est fait que pour des actions qui ne sont pas censées durer dans le temps.
Je me prends la tête depuis deux jours pour trouver une solution à mon problème.
Y-a-t-il quelqu'un qui aurait une idée please ???
Merci d'avance....
Partager