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

API standards et tierces Android Discussion :

Comment gérer une pile d'Activities ? (NFC, IntentFilter)


Sujet :

API standards et tierces Android

  1. #1
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut Comment gérer une pile d'Activities ? (NFC, IntentFilter)
    Bonjour,
    Il y a quelque chose que j'aimerai réaliser, mais je n'arrive pas à l’exprimer.



    Je suis actuellement en train de développer une application qui lit et écrit sur des tags NFC.

    J'aimerais que lorsque l'utilisateur a lancé l'application et qu'il scan un tag NfcV une Activity se lance, sans que l'utilisateur puisse demander avec quel logiciel gérer le tag.
    J'ai donc utilisé le ForegroundDispatch :
    http://developer.android.com/resourc...dDispatch.html

    En fait j'ai créé une classe qu'extends Activity et j'ai remis le onCreate(), onResume() et onPause().
    J'ai changé le Flag par Intent.FLAG_ACTIVITY_NEW_TASK, comme ça si je suis dans l'Activity lancé par les PendingIntent / IntentFilter tout ça et ben je relance l'Activity par dessus (même si c'est pas ce que j'aimerais faire au final).
    Et ensuite au lieu de faire extends mes classes vers Activity je les extends avec ma nouvelle classe.

    Ce que j'aimerais faire maintenant, c'est qu'en lisant l'id du tag j'arrive dans l'Activity Liste, avec lancé en dessous l'Activity Menu et encore en dessous l'Activity Sommaire.

    Parce que là j'ai créé une Activity pour le test et je ne sais pas comment m'y prendre pour qu'elle soit lié à l'application, parce que là si j'ai backPressed et ben je quitte l'application.

    J'ai pensé à des solutions, mais je ne sais pas exactement comment les implémenter, par exemple redéfinir, onBackPressed() pour qu'elle finish() l'Activity et en lance une autre.
    Mais imaginons que l'utilisateur soit déjà dans une Activity Liste ça risque de créer des Activities en parallèles.

    J'explique mal, mais en gros j'aimerais lancé une Activity avec d'autres Activities derrière elle.

    Ou alors je prend le problème dans l'ordre.
    Je fais une sorte d'inverse de onActivityResult(), en utilisant les getIntent().getExtras().
    Je lance la première Activity elle regarde l'extra si il y a une valeur elle lance la deuxième et ainsi de suite.

    Et sinon comment faire pour savoir comment l'Activity a été lancé ?
    J'aimerais savoir quand l'Activity à été lancé en dehors de l'application parce que dans le Manifest il y a ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     <meta-data android:name="android.nfc.action.NDEF_DISCOVERED" android:resource="@xml/nfc_tech_filter" />
    <intent-filter>
          <action android:name="android.nfc.action.TAG_DISCOVERED" />
          <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
    Donc voilà si vous avez des conseils à me donner, merci de m'en faire part.
    Bonne soirée.
    Au revoir.
    Keith Flint 1969 - 2019

  2. #2
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    J'ai essayé une solution, mais c'est pas encore top.
    Depuis Liste lors du onBackPressed() j'envoie l'ID qui va me permettre de créer le Menu je startActivity() et je finish(), et depuis le Menu lors du onBackPressed() je startActivity() du sommaire et je finish().

    Le problème c'est qu'il faudrait que je vérifie, si il ni a pas déjà un Menu ou un Sommaire lancé.

    Parce que si l'utilisateur va dans Sommaire -> Menu.
    Là il tag, il se retrouve donc dans une Liste.
    En backPressant :
    Liste -> Menu -> Sommaire -> Menu -> Sommaire -> Sommaire -> terminé

    Alors que j'aimerais :
    Liste -> Menu -> Sommaire -> terminé
    Quoi qu'il arrive.

    Edit, je vais regarder là dedans :
    http://developer.android.com/guide/t...ack-stack.html
    Peut être getCallingActivity () ou quelque chose comme ça.
    Keith Flint 1969 - 2019

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 141
    Points : 177
    Points
    177
    Par défaut
    Imposer à l'utilisateur un mode de fonctionnement (avec tes différentes activités qui se lancent) c'est pas forcement très bien (du point de vue programmeur et utilisateur). Ne peux tu pas le laisser décider par lui même ?

  4. #4
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    Euh je vois pas très bien là...
    Ça ne peut fonctionner que d'une façon.

    En fait l'utilisateur va consulter une liste d'item qu'il possède, il peut en ajouter, en supprimer ou y associer un tag.

    Ces items sont rangé dans une liste, ces listes sont rangé dans des menus.

    Parce que là par exemple, en dehors de l'application l'utilisateur peut lire un tag, si il choisit mon application, il va avoir les infos sur l'item associé à se tag.
    Le problème c'est que si il recule, au lieu d'arriver dans une autre Activity il va fermer l'application.
    Keith Flint 1969 - 2019

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 141
    Points : 177
    Points
    177
    Par défaut
    Pourquoi veux-tu qu'il recule ?

    C'est toi qui l'impose là !

    Une fois qu'il a scanné propose lui une action (qui peut correspondre à un
    lancement d'activité par exemple). Mais ne lui impose pas une démarche qui
    n'est pas naturelle.

    Tu imposes à l'utilisateur tes contraintes : ce n'est pas la meilleurs approche.

  6. #6
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    En fait c'est l'adaptation d'un logiciel PC sur Android.
    Et dans la version PC peu importe où l'utilisateur se trouve si il scan un tag, il va se trouver dans un onglet avec une liste d'item et l'item correspondant est mis en évidence.

    J'explique mal, mais je vous assure que c'est tout à fait logique.

    En fait c'est un logiciel de gestion de cave à vin.
    Le sommaire propose toutes les caves de l’utilisateur.
    Imaginons que l'utilisateur choisisse "Cave 3", là on à un choix entre tout les vins dispo dans cette cave par exemple : Alsace Grand Cru Frankstein.
    Si on clique dessus on voit la liste de toutes les bouteilles d'Alscace Grand Cru Frankstein de la Cave 3 de l'utilisateur.
    Et là toutes les bouteilles s'affichent et si on clique dessus, on est encore dans une autre activité avec les détails de la bouteille.
    On peut associer un TAG à cette bouteille.

    Quand on scan un tag on arrive dans les détails de la bouteille et ce serait vraiment classe que si l'utilisateur recule il se retrouve dans la liste des bouteilles du même type.
    Keith Flint 1969 - 2019

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 168
    Points : 212
    Points
    212
    Par défaut
    Je sais pas si ça peut t'aider, c'est pour gérer ce que tu fais après un appui sur la touche retour

    Pour toutes les versions d'android :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            // Ce que tu veux faire en appuyant sur retour
            return true;
        }
     
        return super.onKeyDown(keyCode, event);
    }
    A partir d'Android 2.0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Override
    public void onBackPressed() {
            // Ce que tu veux faire en appuyant sur retour
        return;
    }

  8. #8
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    Merci, mais je connais.

    Le problème c'est que j'arrive pas à organiser la gestion des Activity.
    Il faut toujours qu'il y ait la même pile d'Activity.
    Il en faut au maximum une de chaque type.

    Mais j'explique mal.
    Keith Flint 1969 - 2019

  9. #9
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    J'ai trouvé comment expliquer clairement mon problème.

    J'ai les activités A, B, C et D.
    Et l'ordre doit toujours être :
    ABCD

    Mais par contre il est possible d'être directement téléporté vers D depuis n'importe où, même en dehors de l'application.

    Edit :
    J'ai trouver une solution qui fonctionne bien pour le moment.
    Quand on backPress dans D, on ouvre C et on ferme D.
    Quand on backPress dans C, on ouvre B et on ferme C.
    Quand on backPress dans B, on ouvre A et on ferme B.

    Pour éviter qu'il y ait des doubles, dans le Manifest, j'ai mis ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    android:launchMode="singleTop"
    C'est plutôt efficace, par contre quand je me téléporte ça ne fonctionne pas, je sais pas pourquoi, mais D ne lance pas C, pourtant ça entre bien dans onBackPressed()...

    Edit :
    En fait j'avais un message en Orange, maintenant même en se teleportant ça fonctionne.

    Enfin je sais pas, j'arrive à faire planter l'application.
    Mais je ne sais pas comment...

    Edit :
    Parfois il y a ABC de lancé on se téléporte dans D, quand on va fermer D on va créer un nouveau C, j'aimerais que le nouveau reste et que l'ancien disparaisse.
    Des fois ça fonctionne, mais je cerne mal les erreurs pour le moment.

    Des fois en voulant fermer A, il existe une autre activité derrière...
    Keith Flint 1969 - 2019

  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
    Il me semble que cela ressemble à un tab-host ce truc (l'UI en moins)...

    Pour simuler, oui, il faut utiliser onBackPressed()...

    Par contre, ne jamais laisser android gérer la pile des activité....
    En bref... Faire que toutes les activités héritent de ce code:
    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
     
    public class FixedListActivity extends Activity
    {
         protected Class<? extends FixedListActivity>   getBackActivityClass()
         {
               return null;
         }
     
         public void onBackPressed()
         {
              Intent back = getBackIntent();
              if (back != null)
                   startActivity(this,back);
              finish();
          }
     
          protected Intent getBackIntent()
          {
              Class<? extends FixedListActivity> cl = getBackActivityClass();
              return (cl == null) ? null : new Intent(this, cl);
          }
     
          protected void startActivity(Class<? extends FixedListActivity> activity, Bundle addedData)
          {
              Intent next = new Intent(this,activity);
              if (adddedData != null) 
                   next.setExtra(addedData);
              startActivity(this,next);
              finish(); // <= pour etre sur de ne plus être dans la pile !
           }
    }
    Et voila... toutes les classes doivent implémenter getBackActivityClass() (ou sinon être quittées sans rien démarrer)... et appeler startActivity() pour passer à l'activité voulue...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #11
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 604
    Points : 18 520
    Points
    18 520
    Par défaut
    Merci, je vais essayer ça.

    Même si je ne crois pas que ça réponde à tout ce que j'attends, puisque parfois il ni aura que l'activité D, et il faudra derrière créer C, B et A.

    Cela dit je devrais réussir à le faire en utilisant ce code.

    Mais normalement simplement avec Intent.FLAG_ACTIVITY_SINGLE_TOP ça devrait le faire, je ne comprend pas pourquoi ça ne fonctionne pas correctement...

    Edit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    Alors ça fonctionne presque correctement.
    Je peux lancer uniquement D et si je vais en arrière ça fait bien D -> C -> B -> A -> Quitter.

    Le problème c'est que si je fais par exemple :
    A -> B1 -> C1 et que là je scan un tag je me retrouve bien dans D2, mais si je recule je me retrouve dans C1 au lieu de C2.
    En fait ça garde en mémoire l'Activity déjà lancé, alors que la prioritaire ça devrait être la nouvelle.

    Re edit :
    J'ai trouvé !
    Dans public void onNewIntent(Intent intent) je récupère les extras que j'ai mis dans l'intent pour recréer l'Activity et je l'ai met dans l'Activity, en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    getIntent().putExtra("extra1", intent.getStringExtra("extra1"));
    getIntent().putExtra("extra2", intent.getStringExtra("extra2"));
    getIntent().putExtra("extra3", intent.getStringExtra("extra3"));
    Après dans le onResume() ça fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    extra1=getIntent().getExtras().getLong("extra1");
    extra2=getIntent().getExtras().getString("extra2");
    extra3=getIntent().getExtras().getString("extra3");
    C'est les faux noms et c'est pas super optimisé de faire getExtras() à chaque fois, mais bon c'est pour l'exemple.
    Je vais faire ça avec les Activities nécessaire et ça devrait fonctionne comme je le souhaite.
    Keith Flint 1969 - 2019

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

Discussions similaires

  1. [CF][PPC/VB.NET/Datagrid] Comment gérer une colonne CheckBox ?
    Par joefou dans le forum Windows Mobile
    Réponses: 5
    Dernier message: 28/08/2006, 17h08
  2. Réponses: 7
    Dernier message: 24/03/2006, 10h51
  3. [VB.NET] Comment gérer une DLL Delphi ?
    Par slimjoe dans le forum VB.NET
    Réponses: 2
    Dernier message: 09/01/2006, 00h10
  4. Site web : Comment gérer une version Officiel et Officieuse
    Par AlphaYoDa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 05/12/2005, 08h48
  5. Comment gérer une Progressbar pendant un CopyFrom ?
    Par greg778 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 25/07/2005, 15h34

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