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 :

Lancement de plusieurs instances de l'application


Sujet :

Android

  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut Lancement de plusieurs instances de l'application
    Bonjour,

    Je développe un lecteur de musique pour Android et quand l'utilisateur fait la manœuvre suivante :

    • Lancement de l'application
    • Appui sur le bouton home
    • Clique sur l’icône de l'application pour ré-afficher l'appli

    Alors l'application lance une deuxième instance de l'application.
    Bizarrement, ce bug n'apparait seulement quand l'application est installée à partir d'un APK. Si je l'installe via Eclipse (Run As Android Application), je ne rencontre pas ce problème...

    Du coup, ça me prend beaucoup de temps débugger tous ça.
    Donc si vous avez quelques pistes pour trouver l'origine du problème et comment le corriger, je vous en serait très reconnaissant.

  2. #2
    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
    Joli.

    Ca le fait sur chacun des terminaux testés, ou sur certains modèles ?
    Intuitivement, je penche pour un bug coté Android/Dalvik ou de l'une des surcouches.
    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

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    Oui ça le fait sur tout les téléphones (même Nexus) à partir du moment où j'installe via l'APK.

    J'ai vu qu'il y a des options qu'on peut ajouter au manifest pour définir le lancement d'une activity (singleinstance...). Mais apparement c'est réservé à des cas très spécifiques. Peut-être que je suis dans ce cas ??

  4. #4
    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
    Tu peux tenter le singleInstance sur l'activité launcher, c'est ce qui est typiquement fait sur les splashscreen (qui sont, rappelez-le, une mauvaise pratique sous Android).
    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

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    Ah on y arrive j'ai un splashscreen ! Pas le choix...
    Par contre si mon activity spashscreen lance, une autre activity, il faut aussi mettre singleinstance sur cette seconde activity ? C'est cette seconde activty qui pause problème (elle est bindée avec un Service. Lui aussi il faut le mettre en singleinstance ?)

    Ce que je voudrais dans l'absolu c'est que la deuxième fois le splashscreen ne s'affiche pas (ça au pire je peux le gérer avec une variable "hasSplashScreenBeenDisplayed")

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    A mon avis, il n'y a bien qu'une instance de l'application, mais deux instances d'une activité...

    singleOnTop devrait résoudre le problème.

    Ou, si vraiment il faut un splashscreen (franchement, à part les jeux ou je supporte encore, quand une application fait ça, comme méteo-france par exemple, elle part directement à la poubelle), comment est-il affiché ? (qui l'affiche) ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Ou, si vraiment il faut un splashscreen (franchement, à part les jeux ou je supporte encore, quand une application fait ça, comme méteo-france par exemple, elle part directement à la poubelle), comment est-il affiché ? (qui l'affiche) ?
    Je n'ai pas vraiment le choix, mon client en veux un. Pour l'affichage du splashscreen, j'ai une image en fullscreen, dans le onCreate, je lance une AsyncTask qui fait un Thread.sleep de 3 secondes puis démarre l'Activity princpale et finish() l'Activity splashscreen (pour l'enlever de la Sack<Activity> de l'application).

    Je vais regarder tes pistes et je vous tiens au courant.
    Merci.

  8. #8
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Ce que je voulais dire....

    Le 'splashscreen' n'est pas une activité "visible" de l'exterieur... normalement aucun intent ne permet d'y accéder... Les intents permettent d'arriver à des activités à part entière: A, B, C.

    Si les activités doivent afficher un splashscreen, alors elles héritent toutes de SplashActivity qui fait un truc du genre:
    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
     
    class SplashActivity extends Activity
    {
        static private splashShown = false;
     
        public void onCreate(Bundle bundle)
        {
            super.onCreate(bundle);
     
            if (!splashShown) {
                 splashShown = true;
                 startActivityForResult(new Intent(this,SplashScreen.class));
            }
        }
    }
    Ensuite je vois pas trop l'interêt de faire un thread (ou un AsyncTask) qui fait "sleep". [apparté] cette fonction devrait vraiment être marquée: à ne jamais utiliser *sauf* dans un scheduler de tâches[/apparté]

    Un simple:
    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
     
    class SplashScreen extends Activity implements Runnable
    {
         Handler handler;
     
         public void onCreate(Bundle bundle)
         {
             this.handler = new Handler();
             this.handler.postDelayed(this,3*1000*60);
         }
     
         public void run()
         {
             finish();
         }
    }
    Non ?
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    Je t'avoue que je n'avais pas vu le problème sous cette angle là. Vu que le SplashScreen s'affiche avant l'Activity principale ça ne me choquait pas que soit lui qui lance cette dernière. Et que donc que le SplashScreen soit le point d'entrée de l'application. A tester.

  10. #10
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Le problème c'est que le système est basé sur des activités... donc quand tu cliques sur le launcher, si c'est l'activité "splashscreen" qui doit être affichée, c'est celle là qui le sera, même si l'application est déjà lancée sur une autre activité.

    Le splashscreen doit vraiment être vu comme un "rajout" à l'application, plutôt qu'une activité (navigation de l'utilisateur) à part entière. Enfin, c'est mon avis personnel ^^
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #11
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    J'ai suivi ta stratégie de gestion de splash screen mais je me retrouve confronté à un problème.
    En gros avant ce que je faisais :
    SplashscreeenActivity => BluetoothEnablerActivity=> MainActivity

    avec le MainActivity.OnCreate() qui initialise des composants UI et MainActivity.onStart&onResume qui nécessite que les composants UI et le Bluetooth soit initialisé.

    Donc j'ai déporté le code de onCreate() dans une méthode create(). J'appelle cette méthode dans le onResultActivity() qui me confirme que le Bluetooth est activé.
    Les onStart, onResume, onPause et onStop, ne sont executé que si la méthode create est appelée.

    La où je bloque c'est que j'ai l'impression que le onResultActivity est appelé après le onStart(). Mes recherche sur Google avec "onResultActivity + lifecycle" m'ont données l'impression que personne ne sait vraiment. J'ai trouvé tout et son contraire...

    Je n'arrive pas à trouver de documentation (pourtant normalement sur Android, c'est pas ça qui manque) qui précise à quel moment onResultActivity est appelée.
    Quelqu'un sait ou je peux trouver une information fiable là dessus ?

  12. #12
    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
    onResultActivity est invoquée suite au retour de l'Activity lancée avec un startActivityForResult.
    Ca ne fait pas vraiment partie du cycle de vie d'une Activity, plutôt en corollaire puisque ça implique que l'Activity donnant un résultat soit morte.
    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

  13. #13
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Exemple de lifecycle (parmi tant d'autres):


    onCreate
    onStart
    onResume
    .... startActivityForResult
    .... l'activité passe en arrière plan
    onPause
    .... l'autre activité "cache" entièrement l'activité courante
    onStop
    .... le système a décidé qu'il n'y avait pas assez de mémoire
    onDestroy
    .... l'activité tierce "se termine" (finish par exemple)
    onCreate (si onDestroy avait été appelé)
    onStart (si onStop avait été appelé)
    onResume (toujours: retour à l'avant-plan)
    onActivityResult
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  14. #14
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    Ok donc si je comprend bien, je vais être obligé de faire les initialisations faites dans le onStart/onResume à la main.
    Par contre puis-je partir du principe que onStart et onResume ne seront pas appelé après onActivityResult() ?
    Il ne faut pas que je fasse l’initialisation 2 fois tant qu'on n'est pas passé par le onStop/onPause.
    Edit : je viens de mettre ça en place et ça a l'air de marcher. Reste juste à espérer que toute les versions d'android fonctionnent de cette façon

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 24/08/2012, 17h26
  2. [AC-2010] Eviter le lancement de plusieurs instances de mon application
    Par JeanYves70 dans le forum VBA Access
    Réponses: 17
    Dernier message: 11/04/2011, 03h05
  3. Réponses: 4
    Dernier message: 17/08/2006, 09h53
  4. Réponses: 8
    Dernier message: 17/03/2004, 15h40
  5. Communiquer entre plusieurs instances d'applications
    Par bourinator dans le forum C++Builder
    Réponses: 5
    Dernier message: 28/09/2003, 12h24

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