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 :

onResume onStop onDestroy


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut onResume onStop onDestroy
    Bonjour,

    Lorsque je quitte une activité, j'aimerais écrire le score dans un Bundle.

    Ca marche, mais si j'essaye de récupérer le score depuis mon Objet (gameContent), il n'est pas correct.

    Je constate que mon score n'est repris dans mon activité principale que lorsque j'utilise "onResume" et non "onStop" ou "onDestroy", j'ai du mal a comprendre pourquoi.

    Lorsque j'utilise ma fonction "onResume", si j'essaye de récupérer la valeur du score depuis mon objet, elle n'est pas correct...Si je la crée artificiellement, par contre, elle est bien reprise vers l'activité principale :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
     
     
    public class Activity2 extends Activity
    {
        GameContent gameContent;
        int val ;
        //Bundle extras ;
     
            Intent intent ;
     
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
     
            super.onCreate(savedInstanceState);
     
            gameContent = new GameContent(this);
     
            Bundle extras = getIntent().getExtras();
     
            BufferedReader input = null;
     
            setContentView(gameContent);
            val = gameContent.builder.score ;
     
        }
     
     
     
        @Override
        protected void onResume()
        {
     
            val = gameContent.builder.score ;
     
            gameContent.destroyDrawingCache();
            intent = new Intent() ;
            intent.putExtra("key1", val);
     
            BufferedWriter writer = null;
            try {
                writer =
                        new BufferedWriter(new OutputStreamWriter(openFileOutput("demo01",
                                Context.MODE_PRIVATE)));
                //writer.write("meilleur score : " + val );
     
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (writer != null) {
                    try {
                        writer.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
     
            setResult(1, intent);
     
            super.onResume();
        }
     
    }
    Merci si vous pouvez m'aider

  2. #2
    Membre actif Avatar de IsiTech
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Janvier 2012
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Janvier 2012
    Messages : 105
    Points : 270
    Points
    270
    Par défaut
    Il faut que tu override la méthode onSaveInstanceState pour sauvegarder les données que tu souhaites conserver dans un Bundle, et ce Bundle sera récupéré en paramètre de la méthode onCreate(...) avec les données que tu as sauvegardé.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Tu pourrais être un peu plus précis stp ?

    Overrider ma sous-activité ?

    N'est-ce pas ce que je fais ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
    J'arrive bien a passer une valeur dans le Bundle, mais c'est dès lors que j'essaye de passer une valeur qui vient d'un autre objet que j'ai crée dans le "onCreate(...)", que cela ne marche pas, quand je passe par la fonction "onResume".

    Par ailleurs, si j'utilise la fonction onStop(), ou onDestroy(), ma valeur (créer dirrectement ds le Bundle) ne passe pas alors qu'avec un "onResume()", là ca marche...

    Savez vous comment ca se fait ?

  4. #4
    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
    Je comprends pas trop.... on ne met dans le onResume que le code qui doit être executé lorsque l'activité est en avant plan.
    Son corrolaire (onPause) fait l'inverse.

    Pareil pou onStart/onStop() qui sont appelées quand l'activité devient visible ou ne l'est plus.

    onCreate() / onDestroy() c'est quand le système crée l'objet ou le détruit.


    Maintenant, le "Bundle" reçu dans onCreate() provient effectivement de onSaveInstanceState(), il n'est utilisé que dans le cas suivant: le système veut faire "croire" à l'application qu'il s'agit de la même instance d'activité. Exemples:
    * le système (qui a besoin de mémoire) voudrait détruire l'activité (qui n'est plus visible) pour gagner de la mémoire, mais l'utilisateur revient sur l'application... le onSaveInstanceState() sera appelé avant la destruction. le onCreate() avec le bundle sauvé sera appelé après la création de la nouvelle activité qui représente la même instance.
    * Idem dans le cas d'une rotation d'écran. Par défaut le système va détruire l'objet et le recréer (mais en partant du principe que c'est la même instance donc onSaveInstanceState / onRestoreInstanceState).


    Par contre, si on sort de l'activité normalement (back par exemple), et qu'on revient dessus, ce sera *TOUJOURS* une nouvelle instance ! Le onSaveInstanceState ne sera d'ailleurs probablement pas appelé.


    Je ne sais pas exactement le but recherché, mais on écrit dans un "Bundle" principalement pour communiquer entre activités.
    Si le but est de serialiser le score dans un fichier il existe d'autres moyens (par exemple les SharedPreferences), et ce devrait être fait dans le onCreate (lecture du score), onDestroy (ecriture du score).
    Si le but est de passer le score à l'activité appelante, effectivement on passe par un Bundle (et un Intent) avec setResult(S_OK,intent); (l'activité appelante recevant alors le résultat dans le onActivityResult).
    ...

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Merci pour ta réponse.

    Oui, en effet, c'est lorsque je quitte ma sous-activité, avec "back", ou si elle prend fin naturellement, que j'aimerais transmettre le score a l'activité principale.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    En fait j'ai testé avec toutes les méthodes de mémoire et le pb est le même : lorsque j'utilise la touche "back" pour revenir a mon activité principale, je n'arrive pas a récupérer le score avant de quitter.

    Savez vous si au moins une fonction accessible est appelée par l'activité avant de revenir a l'activité principale ?
    Type onStop, onDestroy etc...?

    Car si j'utilise onDestroy(), ca ne marche pas, ma valeur reste la même que celle du départ, même avec les préférences :

    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
     
     
     
        @Override
        protected void onDestroy()
        {
            int val = gameContent.getScore();
     
            SharedPreferences sharedPreferences = getSharedPreferences("MyData", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putString("name", " valeur test" );
     
            editor.commit();
     
            super.onDestroy();
        }
    En revanche la même fonction avec "onResume", fonctionne...mais ne prend que le score au début de la parti.

  7. #7
    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
    Commence ton activité avec startActivityForResult dans ton activité principale.

    Ton activité fille fera un setResult(S_OK,intent) (avec des données dans l'intent de retour pour l'activité principale, comme le score).

    Et surcharge onActivityResult dans ton activité principale pour récupérer ces données ....

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

Discussions similaires

  1. chm HELP_QUIT DeleteFile OnDestroy
    Par ouiouioui dans le forum Débuter
    Réponses: 3
    Dernier message: 04/06/2012, 15h03
  2. onStop() : savoir si l'utilisateur a utilisé home
    Par theanthony33 dans le forum Android
    Réponses: 6
    Dernier message: 15/11/2010, 23h11
  3. [Bug] Événement OnDestroy dans fenêtre dynamique
    Par gregcat dans le forum Delphi
    Réponses: 8
    Dernier message: 05/02/2007, 16h04
  4. Violation d'accés [OnDestroy][D6Perso][MyLittleBase]
    Par Qwazerty dans le forum Delphi
    Réponses: 3
    Dernier message: 20/10/2006, 11h54
  5. [debutant]Différence OnClose/OnDestroy
    Par Reven777 dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/05/2006, 15h56

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