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 :

Utilisation des Services et des Threads


Sujet :

Android

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Utilisation des Services et des Threads
    Bonjour,

    Dans le cadre d'un projet nous devons développer une application.
    Nous souhaitons pouvoir connaitre la position de l'utilisateur afin d'envoyer un SMS lorsqu'il arrive à la destination voulue.

    Nous avons réussi a le faire grâce à des services :
    - Un service SMS
    - un service de géolocalisation utilisant LocationManager

    le service de géolocalisation est appelé par le service de SMS qui est lui lancé au click sur un bouton.
    Une fois les deux services lancés, le servceGPS écoute les changements de position (onLocationChanged) et dans un certains cas, envoie un événement (sendBroadcast).
    Notre service de SMS réceptionne cet événement et envoie un SMS.

    Maintenant que je vous ai exposé ce que nous avons, voici le petit problème que nous rencontrons :
    - Lorsque que l'on quitte l'application (ou qu'elle passe en second plan), les services "s'arrêtent" (si j'ai bien compris ils sont détruits puis se relance ?) et rien ne se passe lorsque l'utilisateur atteint la destination voulue. Ce n'est qu'une fois l'application de retour au premier plan que tout s'effectue.


    J'ai donc fait plusieurs recherches et quelques tests, notamment concernant le fait de créer un nouveau thread pour mon service mais je ne suis vraiment pas sur de ce que je fais .
    J'aurais donc voulu savoir comment vous auriez fait pour que les services fonctionnent et communiquent bien, même quand l'application est en arrière plan.

    Je ne montre pas le code car un peu imbuvable mais je le garde à disposition si quelqu'un souhaite le consulter pour mieux comprendre. Sinon je suis la pour répondre aux questions !

    Merci d'avance,

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 224
    Points
    20 224
    Par défaut
    Pour qu'un service "survive" en fond il faut le démarrer via startService()
    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.
    https://developer.android.com/refere...p/Service.html

    Ceci étant dit je te conseil de jeter un oeil au geofencing : https://developer.android.com/traini...cing.html#java
    Qui semble se rapprocher très forement de ce que tu veux faire.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Tout d'abord merci pour la réponse.

    Je start déjà mon service ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                    Intent smsIntent = new Intent(RenseignerNumeroActivity.this, SmsService.class);
                    smsIntent.putStringArrayListExtra("phoneNumbers", phoneNumbers);
                    startService(smsIntent);

    Voici une partie du code concernant le ServiceSMS :

    Je crée un broadcastreceiver :
    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
        private BroadcastReceiver mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals("com.example.broadcast.GPS_NOTIFICATION")) {
                    boolean isArrived = intent.getBooleanExtra("isArrived",false);
                    if(isArrived){
                        //envoi sms
                        for(int i =0; i<phoneNumbers.size() ;i++){
                            SmsManager sms = SmsManager.getDefault();
                            phoneNumbers.set(i, phoneNumbers.get(i).replaceAll(" ", ""));
                            sms.sendTextMessage((((SmsService)context).phoneNumbers.get(i)), null, "correspondant bien arrivé", null, null);
                            Log.i("INFO", "SMS Envoyé à : " + phoneNumbers.get(i));
                        }
                        Intent stopIntent = new Intent( SmsService.this, GPSLocalisationService.class);
                        stopService(stopIntent);
                        stopSelf();
                    }
                }
     
            }
        };


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //Dans le onCreate, on s'abonne au événement que va envoyer le service GPS
        @Override
        public void onCreate() {
            Log.e("TAG3", "onCreateSERVICE SMS");
     
            mIntentFilter = new IntentFilter();
            mIntentFilter.addAction("com.example.broadcast.GPS_NOTIFICATION");
            registerReceiver(mReceiver, mIntentFilter);
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //c'est dans le onStartCommand que l'on appelle le service de GPS
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            if (intent != null) {
                phoneNumbers = intent.getStringArrayListExtra("phoneNumbers");
            }
     
            startService(new Intent(this, GPSLocalisationService.class));
            return START_STICKY;
        }

    Dans mon service GPS, j'ai une sous classe LocationListener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        private class LocationListener implements android.location.LocationListener {
            Location mLastLocation;
     
            private LocationListener(String provider) {
                Log.e(TAG, "LocationListener " + provider);
                mLastLocation = new Location(provider);
            }
     
    ...
    Qui implémente les méthodes de l'interface.


    De ce que je vois, quand le cas ou je met l'application en arrière plan ou que je la quitte, rien n'est détruit ou recréer, mais rien ne se passe non plus, c'est lorsque l'application a de nouveau le focus que le code est éxécuté. PI : je voudrais que le code s'effectue a chaque changement de position, j'utilise l'émulateur android studio et send des nouvelles positions depuis ce dernier


    En attendant le regarde GeoFence qui semble en effet correspondre exactement à nos besoins. Même si cela remplacera la solution que nous avons mise en place, étant ma première expérience avec les services Androids j'aurais quand même bien voulu faire réussir à marcher ce que j'ai fait, et surtout comprendre


    EDIT : Après plus de recherche, je pense avoir trouvé une piste, voici comment je déclare mon receiver dans le manifest :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            <receiver android:name=".SmsService">
                <intent-filter>
                    <action android:name="com.example.broadcast.GPS_NOTIFICATION" />
                </intent-filter>
            </receiver>
    Il me renvoit une erreur disant que SMSService is not assignable to BroadCastReceiver ce qui semble logique puisque ma classe est déclaré comme un service, c'est ma sous classe qui est un BroadCastreceiver.


    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation web service avec des images
    Par Nanais19 dans le forum Services Web
    Réponses: 5
    Dernier message: 04/10/2012, 16h08
  2. [Web Services] Formater des exceptions sur des services web
    Par X448GN dans le forum Spring
    Réponses: 1
    Dernier message: 21/04/2009, 14h45
  3. Utiliser JOGL + shader pour des effets sur des images 2D.
    Par nouknouk dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 19/12/2007, 10h46
  4. Utilisation du Enable avec des combobox ou des listbox
    Par legos dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 19/09/2006, 22h35
  5. Réponses: 2
    Dernier message: 27/04/2006, 16h45

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