Whirpett Posté(e) 31 mars 2011 Share Posté(e) 31 mars 2011 Bonjour, Je vais essayer d'expliquer clairement mon problème. Je réalise une application qui vérifie si de nouvelles demande de clients on été effectué en checkant un serveur régulièrement. Si une nouvelle demande est passée, alors on déclenche une notification. Petit détail, je veux effectuer cette vérification que lorsque l'application n'est pas visible au premier plan (car bien sur lorsqu'elle est au premier plan les infos, sont directement visible). C'est pourquoi je me suis servi du tuto des différents cycle de vie d'une appli. public class accueil extends TabActivity{ private boolean stop; public void onCreate(Bundle savedInstanceState) { stop = false; super.onCreate(savedInstanceState); setContentView(R.layout.accueil); notif(); } public void notif() { new Thread(new Runnable() { public void run() { while(stop) { final String adresseIp = "127.0.0.1"; aClassConnexion test = new aClassConnexion(adresseIp); String Texte = test.dlPage("/REPAR'AUTO/ANDROID/transfert.php?id=admin&mdp=ADMIN"); // Si il y a au moins une demande on affiche une notification int i = Integer.parseInt(Texte); if(i>0) { test(i); } else { // Sinon on supprime les notifications notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); notificationManager.cancel(1); } try { Thread.sleep(2000); } catch (InterruptedException e) {e.printStackTrace();} } } }).start(); } public void test(int nombre) { notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // 1ère affichage de la notification Notification notification = new Notification(R.drawable.test, "Nouvelle demande", System.currentTimeMillis()); // on créer une intent vers l'appli Intent intentNotif = new Intent(getBaseContext(), accueil.class); // Puis on l'associe lors du clic sur la notif PendingIntent pendingIntent = PendingIntent.getActivity(accueil.this, 0, intentNotif, 0); notification.setLatestEventInfo(accueil.this, "Accéder à l'application", "Nombre de demandes : "+nombre, pendingIntent); // Supprime la notification lors de l'appui sur celui-ci notification.flags |= Notification.FLAG_AUTO_CANCEL; // vibration notification.defaults |= Notification.DEFAULT_VIBRATE; // sonnerie //notification.defaults |= Notification.DEFAULT_SOUND; // affichage notificationManager.notify(1, notification); } /* @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); flag = 0; notif(); } @Override public void finish() { // TODO Auto-generated method stub super.finish(); } */ protected void onPause() { // TODO Auto-generated method stub super.onPause(); stop = true; //notif(); //flag = 0; //notif(); } protected void onResume() { super.onResume(); stop = false; //notif(); } protected void onRestart() { super.onResume(); stop = false; //notif(); } } Donc lorsque je suis sur l'appli, aucune notification pas de problème. Lorsque j'appui sur le bouton home, la les notifications se déclenche, mais lorsque je suit le lien vers mon application (present sur la notif) et bien les notifications ne s'arrête pas. Je ne vois pas ou est le problème (je pense qu'il vient du thread, mais bon ...) Si quelqu'un pense m'aider, merci Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 1 avril 2011 Share Posté(e) 1 avril 2011 Les traitements d'arrière-plan tel que ta vérification sont à implémenter au travers d'un Service (doc), indépendant de l'IHM et d'une quelconque Activity, dont on ne maîtrise pas le cycle de vie PS: utilise les balise [ code ] / [ /code ] dans tes posts quand tu y mets des extraits de code, ça sera plus lisible... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Whirpett Posté(e) 1 avril 2011 Auteur Share Posté(e) 1 avril 2011 Tu n'aurais pas un petit exemple, car je n'arrive pas à comprendre le fonctionnement Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Whirpett Posté(e) 1 avril 2011 Auteur Share Posté(e) 1 avril 2011 J'ai continuer a fouiller un peu, et j'ai compris ou se trouvait le problème avec les services (je l'avais mal déclarer dans le manifest). Donc j'ai bien une méthode pour le onStart et le onStop : public class ExampleService extends Service { private NotificationManager notificationManager; // Quand le service est créé public void onCreate() { Toast.makeText(getBaseContext(), "Start Service", Toast.LENGTH_SHORT).show(); } public void onStart(Intent intent, int startId) { new Thread(new Runnable() { public void run() { while(true) { /* final String adresseIp = "192.168.1.14"; aClassConnexion test = new aClassConnexion(adresseIp); String Texte = test.dlPage("/REPAR'AUTO/ANDROID/transfert.php?id=PERAUDEAU&mdp=0"); // Si il y a au moins une demande on affiche une notification int i = Integer.parseInt(Texte); */ int i= 1; if(i>0) { test(i); } else { // Sinon on supprime les notifications notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); notificationManager.cancel(1); } try { Thread.sleep(2000); } catch (InterruptedException e) {e.printStackTrace();} } } }).start(); } public void onDestroy() { Toast.makeText(getBaseContext(), "Stop Service", Toast.LENGTH_SHORT).show(); Thread.currentThread().stop(); } } DOnc je démarre mon service sur le onStop() de l'activité et je l'arrête sur le onResume() de cette même activité. Mais je n'arrive pas à stopper mon service ( et donc killer mon thread), vois tu comment faire ??? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Whirpett Posté(e) 3 avril 2011 Auteur Share Posté(e) 3 avril 2011 un ptit UP !!! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 4 avril 2011 Share Posté(e) 4 avril 2011 Garde une référence sur le thread que tu lances, sinon tu ne risques pas de pouvoir l'arrêter (actuellement, tu essayes d'arrêter le thread courant, ie le thread UI : pas bon !) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Whirpett Posté(e) 5 avril 2011 Auteur Share Posté(e) 5 avril 2011 Salut, J'ai finalement résolu mon problème en remplaçant le true de la boucle par un booleen dont je change la valeur quand je doit l'arrêter. J'ai essayer en mettant mon string en variable de classe, et en utilisant la méthode stop(), mais sa nefonctionne pas ( méthode dépreciée ). Merci de m'avoir aidé Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 5 avril 2011 Share Posté(e) 5 avril 2011 Il ne faut pas utiliser effectivement la méthode stop(), mais la méthode interrupt(), pour demander l'arrêt d'un thread (et tester dans la boucle du thread avec la méthode isInterrupted() pour savoir si une demande d'arrêt du thread a été faite) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.