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 :

Récupérer l'Activity originaire d'un Intent


Sujet :

Android

  1. #1
    Membre confirmé Avatar de Rappunzell
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut Récupérer l'Activity originaire d'un Intent
    Bonjour ,

    je ne sais pas si ma question paraitra claire. Je m'explique :

    J'ai une Activity A qui déclare un Intent afin de démarrer une autre Activity B, dans lequel je met un Bundle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Bundle bdl = new Bundle();
    bdl.putString("data1", "foo");
    bdl.putString("data2", "bar");
     
    Intent intent = new Intent(A.this, B.class);
    intent.putExtras(bdl);
    startActivity(intent);
    Dans l'activité B, j'aimerais pouvoir créer un intent dont le but sera de redémarrer l'activité qui l'a "appelé" (en l'occurrence A)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Intent intent = new Intent(B.this, A.class);
    startActivity(intent);
    Ok, sauf que ce n'est pas forcément A qui va appeler B, ça peut être C, D ou encore YoupiLaJoieLesOiseauxChantent...

    J'ai donc essayé ceci dans B:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Class<? extends Intent> c = this.getIntent().getClass();
    Intent intent = new Intent(B.this, c);
    startActivity(intent);
    Mais ça ne fonctionne pas, j'ai droit à un "Force close".

    Ce que je veux faire est-il possible ? Comment procéder ?

    Merci

  2. #2
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    startActivityForResult() n'est pas ce que vous cherchez ?

  3. #3
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    Je ne crois pas qu'on puisse récupérer le contexte (i.e. l'activité appelante) à partir d'un intent. Mais pourquoi ne pas ajouter un simple extra :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //code de l'activité A
    Intent i = new Intent(...); 
    i.putExtra("originator", "A");
     
    //code de l'activité YoupiLaJoieLesOiseauxChantent
    Intent i = new Intent(...); 
    i.putExtra("originator", "YoupiLaJoieLesOiseauxChantent");
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  4. #4
    Membre confirmé Avatar de Rappunzell
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut
    Bonjour,

    merci à vous deux pour vos réponses.

    nicroman :

    Non, je cherche a récupérer la classe de l'activité appelante afin de pouvoir recréer un intent pour la rappeler.


    Hephaistos007 :

    Très bien mais, dans ton exemple en tout cas, je récupère un simple String. Un intent a besoin de la classe de l'activité cible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Intent intent = new Intent(A.this, B.class);
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Intent intent = new Intent(A.this, "B");
    Comment faire si je te suis ?

  5. #5
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    Par les techniques de réflexivité :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    final Class<?> cible = Class.forName("YoupiLaJoieLesOiseauxChantent");
    Intent intent = new Intent(A.this, cible);

    Consulter aussi les tutoriels et cours de formation pour apprendre Android : http://android.developpez.com/cours/, il y a sûrement l'explication.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  6. #6
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Rappunzell Voir le message
    Non, je cherche a récupérer la classe de l'activité appelante afin de pouvoir recréer un intent pour la rappeler.
    Oui, j'avais bien compris, ce qui m'inquiète c'est le risque de boucles dans la pile des activités... A=>B=>A=>B=>A... Appuyer 5 fois sur back pour quitter l'appli !!!! En général ce genre d'appli ne reste jamais bien longtemps installée.

  7. #7
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    Tu peux retirer programmatiquement une activité de la pile.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  8. #8
    Membre confirmé Avatar de Rappunzell
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Oui, j'avais bien compris, ce qui m'inquiète c'est le risque de boucles dans la pile des activités... A=>B=>A=>B=>A... Appuyer 5 fois sur back pour quitter l'appli !!!! En général ce genre d'appli ne reste jamais bien longtemps installée.
    Si ça peut te rassurer, j'utilise startActivityForResult(), setResult() et onActivityResult() dans laquelle je "kill" l'activité... Pas de danger au niveau de l'appui répété de la touche retour. Et puis de toute façon l'appli n'est pas destinée à finir sur le market.

    Bref, ceci étant fait, je répète que ce n'est pas mon sujet


    Hephaistos007 :

    J'ai tenté ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    String nomClasse = bdl.getString("origine");
     
    try {
            final Class<?> cible = Class.forName(nomClasse);
    	intent = new Intent(TraitementErreurs.this, cible);
    } 
    catch (ClassNotFoundException e) {
    	e.printStackTrace();
    }
    En traçant, je constate que la methode forName renvoie l'exception... Pourtant nomClasse contient bien le bon nom, je ne comprend pas.

  9. #9
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    Il faut sans doute mettre le nom qualifié de la classe (i.e. prefixé par les paquetages), par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "com.toto.appli1.YoupiLaJoieLesOiseauxChantent"
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  10. #10
    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,

    Tu peux récupérer l'Activity parente qui t'a appellé :

    http://developer.android.com/reference/android/app/Activity.html#getPar
    ent()


    Pour utiliser cette fonction il te faut passer par des ActivityGroup, de là tu pourra récupérer le nom de ton activity mère et récupèrer son Intent.


    Sinon passer par les extra est une solution si les embededView vous pose problème.


    Maintenant comme là fait remarquer nicroman le risuqe de boucle est grand, à moins de mettre un flag sur le lancement de l'intent qui permettra de remettre l'activity déjà lancé en avant-plan. (voir les paramètre de l'activity à son lancement par des Flags ou directement de l'application dans le manifest. )

    Si ça peut te rassurer, j'utilise startActivityForResult(), setResult() et onActivityResult() dans laquelle je "kill" l'activité... Pas de danger au niveau de l'appui répété de la touche retour. Et puis de toute façon l'appli n'est pas destinée à finir sur le market.
    Donc en gros tu tues la mère après avoir appelé la fille , pour que la fille ne créer pas une nouvelle mère :/. Je ne pense pas que cela soit la bonne solution, en faisant cela tu perds le cheminement de ton application. si l'utilisateur fait back, il sortira du programme, alors qu'il aurait aimer revenir sur l'activity précédente.

  11. #11
    Membre confirmé Avatar de Rappunzell
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Novembre 2007
    Messages : 93
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Donc en gros tu tues la mère après avoir appelé la fille , pour que la fille ne créer pas une nouvelle mère :/. Je ne pense pas que cela soit la bonne solution, en faisant cela tu perds le cheminement de ton application. si l'utilisateur fait back, il sortira du programme, alors qu'il aurait aimer revenir sur l'activity précédente.
    En fait si, justement, car l'Activity est un traitement des erreurs. Lorsqu'une Activity du programme renvoi une exception qui n'est pas traitée (erreur inconnue), l'activité traitements des erreurs est appelée. Celle-ci affiche un message prévenant que l'appli a plus ou moins "planté", et propose de nous envoyer directement le message par mail, SMS ou XMPP.

    Sans rentrer dans les détails, il s'agit d'une appli qui permet d'envoyer des SMS à une liste de personne se trouvant dans une base de données. Chaque utilisateur possède sa liste (est rattaché à une base, en fait)

    Ce n'est pas moi qui interroge la base, mais un script python. "J'utilise" le script à l'aide d'XMLRPC.

    L'utilisateur doit d'abord se loguer. Le script me renvoie les infos relatives à l'utilisateur (Liste de diffusions, messages préenregistrés, etc).

    Au cas où cette partie génère des erreurs inconnues, je prend les devants en implémentant cette gestion des erreurs. On gagne du temps et évitons ainsi des appels.

    L'autre partie consiste à l'envoi. Une fois que l'utilisateur à choisie sa liste, rédiger son message, j'envoie ces infos au script qui va s'occuper de générer une requête qu'il enverra à la plateforme d'envoi de SMS.

    Encore une fois, cette risque sera sûrement source d'erreur imprévue, donc là encore, je devrait faire appel à ma gestion des erreurs.

    Vous voyez le merdier ?

    J'aimerais pouvoir revenir à l'activité précédente pour donner le choix à l'utilisateur de refaire un essai, mais seulement si il choisit de nous envoyer l'erreur, tout simplement.


    Sinon, merci beaucoup Hephaistos007, ce que tu as précisé fonctionne !

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

Discussions similaires

  1. [PrimeFaces] Récupérer ligne active datatable
    Par luperrot dans le forum JSF
    Réponses: 2
    Dernier message: 27/09/2012, 16h49
  2. [AC-2003] Récupérer valeur active d'un autre form.
    Par lbar012001 dans le forum IHM
    Réponses: 2
    Dernier message: 01/02/2011, 18h03
  3. Récupérer cellule active open office
    Par j-lo28 dans le forum VB.NET
    Réponses: 0
    Dernier message: 30/10/2010, 21h54
  4. Réponses: 6
    Dernier message: 13/10/2008, 15h36
  5. [InnoSetup] Récupérer l'active code page d'une machine
    Par brouss dans le forum Autres langages
    Réponses: 1
    Dernier message: 23/03/2007, 12h54

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