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 :

Problème avec le cycle de vie d'une application


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 41
    Points : 39
    Points
    39
    Par défaut Problème avec le cycle de vie d'une application
    Bonjour,
    Je suis entrain de crée une application qui serait une sorte de serveur sms. Elle communique avec un serveur par socket. Le serveur envoi un message contenant un numéro de téléphone + un message à envoyer. Au début j'avais mis tout dans le onCreate(). J'ai voulu séparer en fonction du cycle de vie de l'application et depuis rien ne va plus. Mon application ne lit plus les données du socket, elle essaye de lire le socket avant qu'il soit créé. Et le socket est créé seulement quand on a envoyer l'adresse ip du serveur avec la méthode onTouch(). Le socket est bien créé et le serveur envoie bien le message. L'erreur est donc dans l'application. Si vous avez une idée ça me serait très utile. Merci!

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    public class MainActivity extends Activity implements View.OnTouchListener
    {
        private Socket socket;
        private BufferedReader inFromServer;
     
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.main);
             Button b =(Button) findViewById(R.id.bouton);
             b.setOnTouchListener(this);
        }
        @Override
        public void onStart(){
            super.onStart();
            String numéro,message;
            String[] donnée;
            Toast toast;
     
     
            try{
     
                message=inFromServer.readLine();
                donnée=message.split("#");
                numéro=donnée[0];
                message=donnée[1];
     
                toast=Toast.makeText(getApplicationContext(),"Message :"+message, Toast.LENGTH_LONG);
                toast.show();
     
                SmsManager sms;
                sms=SmsManager.getDefault();
                sms.sendTextMessage(numéro, null, message, null, null);
     
                toast=Toast.makeText(getApplicationContext(),"Message envoyé à "+numéro, Toast.LENGTH_LONG);
                toast.show();
            }
            catch(Exception e){
                toast=Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG);
                toast.show();
            }
     
        }
        public boolean onTouch(View view, MotionEvent event){
     
            Toast toast;
            int i=0;
            try{
                    EditText text=(EditText) findViewById(R.id.adIp);
                    if(socket!=null){
                        socket.close();
                        inFromServer.close();
                    }
     
                socket=new Socket(text.getText().toString(),16000);               
                inFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));      
     
            }
            catch(Exception e){
                toast=Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG);
                toast.show();
            }
            return true;
        }
        public void onDestroy(){
            try{
                socket.close();
                inFromServer.close();
            }
            catch(Exception e){
     
            }
     
        }
    }

  2. #2
    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
    Ben oui... jusque là cela me semble logique....


    onTouch n'est appelé qui si l'utilisateur appuie sur le bouton (en fait je pense que tu veux utiliser "onClick" mais bon c'est un autre sujet).

    Hors, avant que ce onTouch puisse être appelé, d'autres fonctions sont appelées dans l'activité:

    onCreate (dès que et seulement si l'activité est crée par un Intent).
    onStart (dès que l'activité est visible, même partiellement)
    onResume (dès que l'activité est en avant-plan)

    ensuite on a le chemin inverse:
    onPause (dès que l'activité n'est plus en avant-plan).
    onStop (dès que l'activité n'est plus visible)
    onDestroy (quand le système a décidé que l'activité pouvait être supprimée).


    Donc reste à connaitre le cycle de vie des membres "Socket" et "BufferedStream" (je reviendrai là dessus après).

    Si ceux-ci sont liés à l'appui sur un bouton, leur durée de vie dépend de l'appui sur ce bouton, et n'a rien à voir avec l'activité => tout doit être fait dans le onClick (ou onTouch).
    Si ceux-ci sont liés à l'activité elle-même, tout dépend de la durée de vie des données lues, pour savoir si on doit coller la création dans onCreate/onStart/onResume (et par conséquent la destruction dans onPause/onStop/onDestroy).


    Ensuite, revenons au principe.
    Lire des données d'un serveur, et envoyer un SMS à un numéro (on dirait l'activité d'un trojan ).
    On est bien d'accord qu'il y a deux étapes.

    Etape 1: Lire des données d'un serveur.
    => en entrée: rien
    => en sortie: les données.
    Etape 2: Envoi des données par SMS.
    => en entrée: les données.
    => en sortie: le SMS.

    On voit bien ici, qu'à aucun moment on ne parle de "stream" ou de "socket", mais juste de données.
    D'ailleurs, pour "tester" l'étape 2 on pourrait utiliser des données "préchargées" (et ainsi bypasser l'étape 1).

    Donc je pense que:
    Ouverture socket, lecture données, fermeture socket devraient être fait de manière atomique. D'abord stocker un stream (qui a un état; une position) est dangereux.... Si on appelle deux fois la méthode onStart d'ailleurs, cela risque de ne pas marcher du tout. Ensuite le seul point important ce sont les données de sortie.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 41
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Enfaites mon socket doit rester toujours actif. Tant que l'activité est en cours il est susceptible de recevoir une commande du serveur et d'envoyer un message après.
    Du coup est ce que je dois mettre mon socket dans le onResume()? Vu que techniquement il est utilisé seulement quand l'application est visible?

    Merci de ta réponse

Discussions similaires

  1. Problème avec cycle de vie d'une applet
    Par riadhhwajdii dans le forum Applets
    Réponses: 0
    Dernier message: 16/09/2014, 09h48
  2. Gérer le cycle de vie d'une application PHP avec Phing
    Par Phelim dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 10
    Dernier message: 24/03/2012, 17h50
  3. Cycle de vie d'une application et celui d'une Activity
    Par androidisme dans le forum Android
    Réponses: 4
    Dernier message: 04/09/2010, 21h51

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