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 :

Service contenant un BroadCastReceiver


Sujet :

Android

  1. #1
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut Service contenant un BroadCastReceiver
    J'aimerai créer un service qui me permet de quitter l'application dès que mon mobile est monté.
    Pour cela, je dispose de l'instruction ACTION_MEDIA_MOUNTED.
    Donc, pour savoir si le mobile est monté je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    BroadcastReceiver bcr = new BroadcastReceiver ()
    {
    	@Override
    	public void onReceive (Context context, Intent intent)
    	{
    		//Ici, je ferme l'application
    	}
    };
    IntentFilter filter = new IntentFilter ();
    filter.addAction (Intent.ACTION_MEDIA_MOUNTED);
    registerReceiver (bcr, filter);
    Je place ces lignes de code dans le onCreate de mon Service appelé MyService.

    Ensuite, dans le onCreate de ma première activity je crée mon service comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Intent intent = new Intent (this, MyService.class);
    startService (intent);
    Et dans le Manifest, j'ajoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <service android:name="MyService" />

    Dans un premier temps, je remarque que je n'entre jamais dans le onReceive de mon BroadcastReceiver. Quelqu'un saurait me dire pourquoi?
    De plus, comment faire pour appeler la fonction setResult et finish de l'activity courante?


    Merci d'avance

  2. #2
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Dans un premier temps, je remarque que je n'entre jamais dans le onReceive de mon BroadcastReceiver. Quelqu'un saurait me dire pourquoi?
    il y a une discussion sur le sujet ici :
    http://groups.google.com/group/andro...ecbdc264f94081

    et essaye également avec cette permission
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    De plus, comment faire pour appeler la fonction setResult et finish de l'activity courante?
    Euh via un handle ou observer pour notifier à partir de ton service que l'activity dit se fermer ;

    Bon courage .

  3. #3
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Merci beaucoup ca à l'air de fonctionner en fin de compte!

    En revanche, ceci fonctionne seulement sur l'activity où j'ai déclaré le service! Lorsque j'appelle une autre activité, j'ai l'impression que le service est arrêté.
    Est ce normale?

  4. #4
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    En revanche, ceci fonctionne seulement sur l'activity où j'ai déclaré le service! Lorsque j'appelle une autre activité, j'ai l'impression que le service est arrêté.
    Est ce normale?
    Le service s'arrête que si tu lui signales un Stop

    A facility for the application to tell the system about something it wants to be doing in the background (even when the user is not directly interacting with the application). This corresponds to calls to Context.startService(), which ask the system to schedule work for the service, to be run until the service or someone else explicitly stop it
    Regarde dans les process tu téléphones s'il tourne toujours .

    Par contre si tu veux l'appeler d'une autre activity il faut que tu te "bind" dessus.

  5. #5
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Merci pour ta réponse!

    Que veux tu dire par:
    Par contre si tu veux l'appeler d'une autre activity il faut que tu te "bind" dessus.
    En faite, le mobile peut être monté à n'importe quel moment donc sur n'importe quel activity! Je le seul endroit où je parle de mon service dans mon code est dans ma première vue (pour l'initialiser)! Je pense que cela suffit, je me trompe?

  6. #6
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    En faite, le mobile peut être monté à n'importe quel moment donc sur n'importe quel activity! Je le seul endroit où je parle de mon service dans mon code est dans ma première vue (pour l'initialiser)! Je pense que cela suffit, je me trompe?
    Si tu veux utiliser un handler ou autre il faut bien que ton service sache à qui le remonté. Ce que je voulais dire c'est que ton activity en cours se lie à ton service , en lui donnant un handler pour le prévenir , de ce fait lorsque ton service demandera à fermer l'application tu le sauras à partir de ton activity en cours qui fera le procédure nécessaire à sa fermeture puis l'application.

    Après je ne sais pas s'il y a un moyen pour que ton service puisse prévenir l'application de se ferme sans passer par un handler (le kill.process peut être une solution mais cela n'est pas propre ).

    Si tu as une autre solution je suis preneur .

  7. #7
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Oui j'ai trouvé un moyen en créant une variable globale récupérable avec getApplication ()).getGlobal ()! Dans cette variable, je stocke l'activity en cours


    Cependant, je reviens à mon cas! Pour monter mon disque, je dois, à l'aide de l'onglet des notifications, ouvrir par dessus mon application, une fenêtre "USB branché". Lorsque je monte le disque et que je reviens vers mon application, cette dernière fonctionne toujours mais plusieurs bogues apparaissent du au fait qu'il n'a plus accès à ma base de données. Elle aurait du se terminer.
    Cependant, si je clique sur "monter" et que je reviens rapidement sur l'application avant que cela soit fait, je vois bien mon application se terminer!

  8. #8
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Oui j'ai trouvé un moyen en créant une variable globale récupérable avec getApplication ()).getGlobal ()! Dans cette variable, je stocke l'activity en cours
    Euh getGlobal() c'est une fonction que tu as crée ?


    Cependant, je reviens à mon cas! Pour monter mon disque, je dois, à l'aide de l'onglet des notifications, ouvrir par dessus mon application, une fenêtre "USB branché". Lorsque je monte le disque et que je reviens vers mon application, cette dernière fonctionne toujours mais plusieurs bogues apparaissent du au fait qu'il n'a plus accès à ma base de données. Elle aurait du se terminer.
    Cependant, si je clique sur "monter" et que je reviens rapidement sur l'application avant que cela soit fait, je vois bien mon application se terminer!
    Ces bogues proviennent de la fonction OnResume() de ton actvity ?
    Essaye de mettre des logs pour voir comment les appels sont effectué. (OnResume, finish , onDestroy,..)

  9. #9
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Oups oui je n'ai pas précisé, j'ai créé une classe qui hérite de Application dans laquelle j'instancie une classe que je nomme Global (d'où mon getGlobal)

    Ainsi je n'ai plus qu'à récupérer l'instance de ma classe en faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Global g = ((MyApplication) getApplication ()).getGlobal ();
    Et dans Global je stocke l'activity courante!


    Je vais voir pour les logues!

  10. #10
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Quand je monte mon disque, l'application passe par onStop, onPause et OnResume.

    Cependant, je n'ai rien à cet endroit! D'après toi est ce que l'application reexécute le onCreate à son retour?
    EDIT: Il reexécute bien le onCreate d'où ma perte d'information d ela base sqlite!

    Dernière question, comment faire pour tester avec un simple if si le disque est monté?
    Car dans ce cas j'ai juste à vérifier ceci dans le onResume et terminer l'application si c'est le cas!
    J'avais pensé à un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (getIntent ().getIntExtra ("status", Intent.ACTION_MEDIA_MOUNTED) == Intent.ACTION_MEDIA_MOUNTED)
    {
    setResult (0);
    finish ();
    }
    Mais tu te doute bien que cela ne fonctionne pas!

  11. #11
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    EDIT: Il reexécute bien le onCreate d'où ma perte d'information d ela base sqlite!
    Bien vu , j'allais y venir, dés fois il il repasse si l'activity à été détruite préalablement.

    Dernière question, comment faire pour tester avec un simple if si le disque est monté?
    Car dans ce cas j'ai juste à vérifier ceci dans le onResume et terminer l'application si c'est le cas!
    http://developer.android.com/referen...StorageState()

    Avec cela tu devrais être opérationnel .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (android.os.Environment.getExternalStorageState().equals( 
    android.os.Environment.MEDIA_MOUNTED))

  12. #12
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Étrangement, cette condition ne fonctionne pas! lorsque mon disque n'est pas monté, il entre dans cette condition!

    Je continue à chercher pourquoi mais je pense que j'arrive à la fin

    EDIT:
    Bon je n'y parvient pas!
    J'ai ajouté ceci dans mon activity:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @Override
    	protected void onResume ()
    	{
    		if (android.os.Environment.getExternalStorageState ().equals (
    				android.os.Environment.MEDIA_MOUNTED))
    		{
    			setResult (0);
    			finish ();
    		}
    		super.onResume ();
    	}
    Mais j'ai le même comportement qu'avant voir pire car lorsque je démarre l'application et que le disque n'est pas monté, l'application se referme d'aussi tot! Bizarre car la condition est bien si le disque est monté!

  13. #13
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Ce que je t'ai passé ne marche que pour la sdcard , désolé de la fausse piste.

    Par contre cela veut dire que si l'utilisateur rajoute une sdcard alors tu recevra cet évènement ACTION_MEDIA_MOUNTED.

    Peut être cet évènement te serais plus approprié :
    http://developer.android.com/referen..._UMS_CONNECTED

    public static final String ACTION_UMS_CONNECTED

    Since: API Level 1
    Broadcast Action: The device has entered USB Mass Storage mode. This is used mainly for the USB Settings panel. Apps should listen for ACTION_MEDIA_MOUNTED and ACTION_MEDIA_UNMOUNTED broadcasts to be notified when the SD card file system is mounted or unmounted
    Constant Value: "android.intent.action.UMS_CONNECTED"

  14. #14
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Ca explique bien pourquoi cela ne fonctionne pas! C'est peut être une fausse piste mais c'était intéressant de le savoir

    Dans la description, il y a écrit:
    Apps should listen for ACTION_MEDIA_MOUNTED and ACTION_MEDIA_UNMOUNTED broadcasts to be notified when the SD card file system is mounted or unmounted
    Cela revient donc au même (sauf erreur de ma part)! On se fixe ici sur la sdcart! Mais alors cela voudrait dire que ACTION_MEDIA_MOUNTED se base aussi sur la sdcard?
    Je suis un peu perdu du coup

  15. #15
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Mais alors cela voudrait dire que ACTION_MEDIA_MOUNTED se base aussi sur la sdcard?
    Yep, il me semble que cette action lit également l'évènement pour la sdcard .
    J'ai regarder sur le net vite faite et il est souvent conseillé d'utiliser ACTION_UMS_CONNECTED lorsque l'on veut capter l'évènement sur la connexion avec le PC .

    Par contre je n'ai toujours pas trouvé comment "checker" sans listener si l'USB est connecté.

  16. #16
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Par contre je n'ai toujours pas trouvé comment "checker" sans listener si l'USB est connecté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (intent.getIntExtra ("status", BatteryManager.BATTERY_PLUGGED_AC) == BatteryManager.BATTERY_PLUGGED_USB)

  17. #17
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut

  18. #18
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Donc il ne me reste plus qu'à savoir comment checker sans listener le fait que le disque soit monté (ACTION_UMS_CONNECTED).
    En effet, je peux être connecté en USB sans monter le disque!

  19. #19
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut

    Qu'est ce que tu cherche à faire?

    http://developer.android.com/guide/t...r-element.html

  20. #20
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Je cherche à faire un test dans un if pour savoir si le disque est monté!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Bind de service par BroadcastReceiver
    Par matwia dans le forum Android
    Réponses: 6
    Dernier message: 23/09/2013, 16h17
  2. [Débutant] Reporting services : Rupture dans un rapport contenant plusieurs matrices.
    Par Balwin dans le forum Services Web
    Réponses: 0
    Dernier message: 02/11/2012, 15h36
  3. Différence entre Service et BroadcastReceiver
    Par Messi007 dans le forum Android
    Réponses: 3
    Dernier message: 07/07/2012, 12h50
  4. [PowerShell] Pb nom d'un service contenant $
    Par Magohamoths dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 07/10/2009, 16h22
  5. Service de nommage java C++
    Par Anonymous dans le forum CORBA
    Réponses: 3
    Dernier message: 15/04/2002, 12h48

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