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

Langage Delphi Discussion :

XE7 , FMX, Androïd, inverse de OnSaveState


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 487
    Points : 3 120
    Points
    3 120
    Par défaut XE7 , FMX, Androïd, inverse de OnSaveState
    Hello tout le monde,

    Je suis sur une application Androïd sous XE7.
    L’événement OnSaveState m'indique quand mon application passe en arrière-plan dans le système.
    Ça me permet de faire certaines opérations à ce moment là.

    Maintenant, il me faudrait l'inverse pour réactiver certaines fonctionnalités quand l'application est réactivée.
    Show ne semble pas se déclencher, Activate non plus.

    Est-ce que vous voyez autre chose ?

    Sinon, est-ce qu'un paramétrage quelconque de mon projet pourrait forcer l'application à s’arrêter complètement (plutôt que de rester en mémoire) en cas de passage cote background ?


    Papy !

  2. #2
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Points : 1 950
    Points
    1 950
    Par défaut
    Bonjour,

    As tu essayé d'utiliser TApplicationEvent ?

    Tu peux créer un événement pour récupérer certains événements liés à l'os, un petit exemple :

    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
     
     
    function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
     
    // dans le OnCreate :
    procedure TMainForm.FormCreate(Sender: TObject);
    Var
        l_aFMXApplicationEventService : IFMXApplicationEventService;
    begin
      if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(l_aFMXApplicationEventService)) then
        l_aFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent);
      ...
    end;
     
    (*----------------------------------------------------------------------------------------------------------------------
      HandleAppEvent : On récupère des événements provenant de l'os et liés à l'application
    ----------------------------------------------------------------------------------------------------------------------*)
    function TMainForm.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
    begin
      case AAppEvent of
        TApplicationEvent.FinishedLaunching : MessageDlg('Finished Launching', TMsgDlgType.mtWarning, mbYesNo, 0);
        TApplicationEvent.aeBecameActive : MessageDlg('Became Active', TMsgDlgType.mtWarning, mbYesNo, 0);
        TApplicationEvent.aeWillBecomeInactive : MessageDlg('Will Become Inactive', TMsgDlgType.mtWarning, mbYesNo, 0);
        TApplicationEvent.aeEnteredBackground : MessageDlg('Entered Background', TMsgDlgType.mtWarning, mbYesNo, 0);
        TApplicationEvent.aeWillBecomeForeground : MessageDlg('Will Become Foreground', TMsgDlgType.mtWarning, mbYesNo, 0);
        TApplicationEvent.aeWillTerminate : MessageDlg('Will Terminate', TMsgDlgType.mtWarning, mbYesNo, 0);
        TApplicationEvent.aeLowMemory : MessageDlg('Low Memory', TMsgDlgType.mtWarning, mbYesNo, 0);
        TApplicationEvent.aeTimeChange : MessageDlg('Time Change', TMsgDlgType.mtWarning, mbYesNo, 0);
        TApplicationEvent.aeOpenURL : MessageDlg('Open URL', TMsgDlgType.mtWarning, mbYesNo, 0);
      end;
      Result := True;
    end;

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Hello tout le monde,

    Je suis sur une application Androïd sous XE7.
    L’événement OnSaveState m'indique quand mon application passe en arrière-plan dans le système.
    Ça me permet de faire certaines opérations à ce moment là.

    Maintenant, il me faudrait l'inverse pour réactiver certaines fonctionnalités quand l'application est réactivée.
    Show ne semble pas se déclencher, Activate non plus.

    Est-ce que vous voyez autre chose ?

    Sinon, est-ce qu'un paramétrage quelconque de mon projet pourrait forcer l'application à s’arrêter complètement (plutôt que de rester en mémoire) en cas de passage cote background ?


    Papy !
    Pas testé mais d'après l'aide en ligne c'est tout simplement dans le OnCreate
    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
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      R: TBinaryReader;
    begin
      if SaveState.Stream.Size > 0 then
      begin
        // Recover previously typed text in Edit1 control.
        R := TBinaryReader.Create(SaveState.Stream);
        try
          Edit1.Text := R.ReadString;
        finally
          R.Free;
        end;
      end;
    end;
    contrairement au fonctionnement Android classique, ici SaveState est accessible à tout moment...bien qu'il soit recommandé de ne l'utiliser que dans le OnSaveState pour l'enregistrement et le OnCreate pour la restauration.

    NB: sous Android, l'application n'est pas supposée gérer son cycle de vie, c'est l'OS qui décide s'il est temps de la libérer ou non.

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 487
    Points : 3 120
    Points
    3 120
    Par défaut
    Citation Envoyé par free07 Voir le message
    Bonjour,

    As tu essayé d'utiliser TApplicationEvent ?

    Tu peux créer un événement pour récupérer certains événements liés à l'os, un petit exemple :

    ...
    J'essaierai ça au bureau dès demain.

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 487
    Points : 3 120
    Points
    3 120
    Par défaut
    contrairement au fonctionnement Android classique, ici SaveState est accessible à tout moment...bien qu'il soit recommandé de ne l'utiliser que dans le OnSaveState pour l'enregistrement et le OnCreate pour la restauration.

    NB: sous Android, l'application n'est pas supposée gérer son cycle de vie, c'est l'OS qui décide s'il est temps de la libérer ou non.

    Je n'ai pas de problème sur OnCreate. Mais il n'est déclenché qu'au moment du démarrage de l'application.
    Dans le cas qui m'intéresse, c'est quand on lance l'application, puis qu'on utilise le bouton android pour afficher l'équivalent du bureau Windows.
    L’application fonctionne toujours tant que le système n'a pas besoin de faire de la place pour son usage.
    Si je retape l'icone de mon application, elle est remise au premier plan mais elle n'a pas été arrêtée pour autant.
    C'est ce moment que j'essaie d'intercepter. Et les 2 événements "habituels" ne fonctionnent pas (en tous cas sur mon tel android).
    Mais peut-être que ça provient de mon téléphone utilisé pour les tests.

  6. #6
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Points : 1 950
    Points
    1 950
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Dans le cas qui m'intéresse, c'est quand on lance l'application, puis qu'on utilise le bouton android pour afficher l'équivalent du bureau Windows.
    L’application fonctionne toujours tant que le système n'a pas besoin de faire de la place pour son usage.
    Si je retape l'icone de mon application, elle est remise au premier plan mais elle n'a pas été arrêtée pour autant.
    C'est ce moment que j'essaie d'intercepter. Et les 2 événements "habituels" ne fonctionnent pas (en tous cas sur mon tel android).
    Mais peut-être que ça provient de mon téléphone utilisé pour les tests.

    Je sais que cela fonctionne en utilisant TApplicationEvent sous iOS, je l'ai déjà fait et lorsque l'application revient au 1er plan, ton événement reçoit TApplicationEvent.aeBecameActive.
    Mais j'ai jamais testé sous Android... ( et je suis curieux de savoir si cela fonctionne aussi )

    Par contre, tu peux savoir si l'os prend en compte ces événements avec la méthode SupportsPlatformService qui retourne vrai, comme le test suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Var
        l_aFMXApplicationEventService : IFMXApplicationEventService;
    begin
      if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(l_aFMXApplicationEventService)) then
        l_aFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent);

  7. #7
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 487
    Points : 3 120
    Points
    3 120
    Par défaut
    Je sais que cela fonctionne en utilisant TApplicationEvent sous iOS, je l'ai déjà fait et lorsque l'application revient au 1er plan, ton événement reçoit TApplicationEvent.aeBecameActive.
    Mais j'ai jamais testé sous Android... ( et je suis curieux de savoir si cela fonctionne aussi )
    ça fonctionne très bien sous Androïd , l'essai est concluant. Merci !

    Par contre, pour info, MessageDlg n'est pas autorisé sur ma version . ça me remonte une erreur de type "Message bloquant non autorisé sur cette plateforme"

  8. #8
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Points : 1 950
    Points
    1 950
    Par défaut
    Citation Envoyé par Papy214 Voir le message

    Par contre, pour info, MessageDlg n'est pas autorisé sur ma version . ça me remonte une erreur de type "Message bloquant non autorisé sur cette plateforme"
    J'ai pas encore testé mais pour Android il faut utiliser la procedure MessageDlg(const AMessage: string; const ADialogType: TMsgDlgType; const AButtons: TMsgDlgButtons; const AHelpContext: LongInt; const ACloseDialogProc: TInputCloseDialogProc);et non pas la Fonction MessageDlg que j'ai posté en exemple et qui fonctionne avec iOS mais pas avec Android.

    Pour Android il faut utiliser MessageDlg avec ACloseDialogProc

    C'est expliqué ici

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

Discussions similaires

  1. [XE7] Ecran d'accueil sur Androïd
    Par Teddy dans le forum Débuter
    Réponses: 2
    Dernier message: 17/03/2015, 10h39
  2. XE7 [VCL-FMX] Fermeture d'une fenêtre
    Par Invité dans le forum Delphi
    Réponses: 1
    Dernier message: 29/11/2014, 13h02
  3. XE7 [FMX] - Correcteur orthographique
    Par Invité dans le forum Delphi
    Réponses: 4
    Dernier message: 17/11/2014, 12h20
  4. XE7 - VCL et FMX : réaliser un paquet
    Par Invité dans le forum Delphi
    Réponses: 6
    Dernier message: 10/11/2014, 19h11
  5. XE7-FMX-Win : TEdit -> OnKeyDown : UpCase
    Par Invité dans le forum Composants FMX
    Réponses: 1
    Dernier message: 22/09/2014, 14h14

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