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 stoppé quand je 'kill' l'application ?


Sujet :

Android

  1. #1
    Membre régulier Avatar de dark_vidor
    Homme Profil pro
    Élève
    Inscrit en
    Janvier 2005
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Élève

    Informations forums :
    Inscription : Janvier 2005
    Messages : 321
    Points : 118
    Points
    118
    Par défaut Service stoppé quand je 'kill' l'application ?
    Bonjour,
    Je sollicite votre aide car je dois faire une application qui envoie un Toast dans le futur à l'aide d'un service.

    Je débute en Android, j'ai lu la doc et j'ai produit le code suivant pour mon IntentService :

    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
    public class DelayedToast extends IntentService {
        private final static boolean Debug = true;
        private final static String TAG = "ALT";
     
        public DelayedToast() {
            super("DelayedToast");
        }
     
        @Override
        protected void onHandleIntent(Intent intent) {
            final int delay = intent.getIntExtra("delay", -1);
            if (Debug) Log.i(TAG, "DelayedToast:onHandleIntent delay: " + delay);
            if (delay > 0) {
                SystemClock.sleep(delay * 1000);
                if (Debug) Log.i(TAG, "Wake up !! ");
                // Intent broadcastIntent = new Intent();
                Intent broadcastIntent = new Intent(getApplicationContext(), Receiver.class); // Need to be explicit for Broadcast : https://stackoverflow.com/questions/55610977/why-a-static-broadcastreceiver-not-working
                broadcastIntent.setAction(getString(R.string.intent_action));
                broadcastIntent.putExtra("delay", delay);
                sendBroadcast(broadcastIntent);
                showToast("toast Service: " + delay);
            }
        }
     
        // https://stackoverflow.com/a/34832674
        protected void showToast(final String msg) {
            Handler handler = new Handler(Looper.getMainLooper());
            handler.post(new Runnable() {
                @Override
                public void run() {
                    if (Debug) Log.i(TAG, msg);
                    Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
                }
            });
        }
    }
    J'ai déclaré mon service sur un process spécifique dans le Manifest :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <service
        android:name=".DelayedToast"
        android:enabled="true"
        android:exported="true"
        android:process=":DelayedToast" />
    Mon service est lancé par un bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void onClickStart(View v) {
            EditText editText = findViewById(R.id.delay);
            final String str_delay = editText.getText().toString();
            if (Debug) Log.i(TAG, "MainActivity:onClickStart str: " + str_delay);
            if (!str_delay.isEmpty()) {
                final int delay = Integer.parseInt(str_delay);
                if (Debug) Log.i(TAG, "Q1_MainActivity:onClickStart delay: " + delay);
                if (delay > 0) {
                    Intent intent = new Intent(this, DelayedToast.class);
                    intent.putExtra("delay", delay);
                    startService(intent);
                }
            }
        }
    Je travail avec un A8 pour déboguer mon appli, SDK min 24 pour l'apk

    Lorsque je lance et laisse tourné l'apk en arrière plan tout est bon.
    Quand je ferme l'apk, le service est tué, alors qu'il devrait théoriquement resté actif tant que je ne le stop pas manuellement.



    Voici la trace obtenu avec adb
    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
    C:\Users\dark_vidor>adb shell "ps | grep tp08" // L'application n'est pas lancée
     
    C:\Users\dark_vidor>adb shell "ps | grep tp08" // L'application est en cours d’exécution
     
    u0_a246 20032 3012 2569888 132044 0 0 S test.tp08
     
    C:\Users\dark_vidor>adb shell "ps | grep tp08" // Start "Delayed Toast" (le service)
     
    u0_a246 20032 3012 2573316 135404 0 0 S test.tp08
     
    u0_a246 20090 3012 2324660 79876 0 0 S test.tp08:DelayedToast
     
    C:\Users\dark_vidor>adb shell "ps | grep tp08" // Le Receiver est activé (Broacast Intet)
     
    u0_a246 20032 3012 2580964 137252 0 0 S test.tp08
     
    u0_a246 20090 3012 2326168 96376 0 0 S test.tp08:DelayedToast
     
    u0_a246 20127 3012 2325228 99696 0 0 S test.tp08:Receiver
     
    C:\Users\dark_vidor>adb shell "ps | grep tp08" // Je quit, service killed..
     
    C:\Users\dark_vidor>
    Ça fait une semaine que je regarde tous les tuto sur le sujet (web et youtube)
    Je n'arrive pas à comprendre qu'est ce qui fait que mon service ne perdure pas...

    Auriez vous une idée svp ?

  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 222
    Points
    20 222
    Par défaut
    Ton service est lancé par ton applicatif , et comme l'indique très clairement la doc de l'intent service , il se termine tout seul quand tous les appels à startService sont terminés (ce qui est le cas quand tu kill 'lapplication).
    Il te faut donc un broadcast receiver qui va relancer le service si l'appli est tuée.

    un exemple complet ici par exemple : https://stackoverflow.com/a/52258125
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier Avatar de dark_vidor
    Homme Profil pro
    Élève
    Inscrit en
    Janvier 2005
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Élève

    Informations forums :
    Inscription : Janvier 2005
    Messages : 321
    Points : 118
    Points
    118
    Par défaut
    Bonjour,
    Merci pour ces éléments, je vais faire le même test avec un extends Service.
    En fait quand je lance mon service avec un délais de 60s, j'ai bien tout qui se lance correctement : le onHandleIntent est bloqué par SystemClock.sleep(delay * 1000), mais si au bout de 30sec je quitte TOUT est détruit, alors que le service n'avais pas fini son exécution.
    Est-ce également un comportement normal ?


    Je viens de faire le test avec Service tout court, ça fonctionne, le Service est relancé.
    Cela pose un autre problème, pour stopper complètement mon service, il faut surement passer par une variable intermédiaire.

    Je suis assez surpris qu'il faille autant "bricoler" pour faire tourner un service sans l'arrêter quand l'application est fermée

  4. #4
    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 222
    Points
    20 222
    Par défaut
    Je suis assez surpris qu'il faille autant "bricoler" pour faire tourner un service sans l'arrêter quand l'application est fermée
    Google n'encouragent pas vraiment les services perpétuels , pour la simple et bonne raison que ce consomme de la ressource à l'insu de l'utilisteur. C'est je pense pour ça que c'est pas "évident" d'en faire un.

    Attention avec un extends Service c'est à toi de gérer les éventuels Thread dont tu pourrais avoir besoin, par défaut tout s'execute sur le main thread.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre régulier Avatar de dark_vidor
    Homme Profil pro
    Élève
    Inscrit en
    Janvier 2005
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Élève

    Informations forums :
    Inscription : Janvier 2005
    Messages : 321
    Points : 118
    Points
    118
    Par défaut
    C'est sur, pour la durée des batteries ...

    Mais du coup si on veux faire un service qui vient consulter une url régulièrement pour se mettre à jour, quelle est la meilleur méthode à utiliser ?

  6. #6
    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 222
    Points
    20 222
    Par défaut
    Je connais pas ton besoin, mais typiquement c'est le genre de chose que je ferait quand l'utilisateur intéragit avec l'application.
    Il lance son appli , on lance un service pour vérifier si des màj sont dispo. SI c'est le cas on lui affiche une popup ou juste un toast en fonction de l'importance et c'est tout.

    Perso une appli qui m'affiche un toast alors qu'elle est fermée elle est désinstallée direct.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre régulier Avatar de dark_vidor
    Homme Profil pro
    Élève
    Inscrit en
    Janvier 2005
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Élève

    Informations forums :
    Inscription : Janvier 2005
    Messages : 321
    Points : 118
    Points
    118
    Par défaut
    Lol, c'est clair, mais là c'est pour un besoin "scolaire"

  8. #8
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    On évite de faire ceci, justement.
    Le pull (client vérifiant à intervalle régulier une ressource réseau) est très déconseillé sur mobile car draine la batterie facilement.
    On préfère mettre en place un mécanisme de push (serveur notifiant le client) si les informations sont importantes, sinon une MaJ lors de l'utilisation, comme le souligne grunk.

    Le fait que ce soit un projet scolaire n'est pas une bonne raison de prendre de mauvaises habitudes ou de laisser "le client" (ici le professeur) demander n'importe quoi
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

Discussions similaires

  1. Service de géolocalisation stoppé quand Google Map est lancé
    Par David55 dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 02/10/2013, 15h44
  2. Réponses: 4
    Dernier message: 01/08/2006, 13h15
  3. [Système] lancer / kill une application sous linux
    Par Antoine NSG dans le forum Langage
    Réponses: 1
    Dernier message: 31/10/2005, 16h06
  4. Réponses: 1
    Dernier message: 16/05/2004, 17h56

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