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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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
    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 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    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 éclairé 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
    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 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    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 éclairé 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
    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 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    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

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