PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Andoid, ThreadPersistant et fermeture de l'écran
Andoid, ThreadPersistant et fermeture de l'écran
Débuté par Youri JUTEAU, 07 aoû. 2017 15:12 - 13 réponses
Membre enregistré
36 messages
Posté le 07 août 2017 - 15:12
Bonjour,
Lorsque mon application Android passe en arrière-plan, j'ai un thread persistant qui démarre et mes traitements continuent de s'effectuer sans problème mais si l'utilisateur ferme son écran (pour économiser la batterie), le processus persistant s'arrête.

Est-ce que mon seul choix est de créer un service Android avec la classe"IntentService"?

Si oui, est-ce que je serai en mesure de mapper ma logique d'affaire en WL vers ce service?

J'imagine que les prochaines versions de WM permettront de créer des services Android.

Merci pour vos commentaires.

--
Youri JUTEAU
Montréal
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 07 août 2017 - 17:05
Bonjour,

Vous devez forcément utiliser une notification pour indiquer qu'un thread persistent est en cours ?
Lorsque la fenêtre est fermée, est-ce que la notification reste bien affichée ou non ?

Cdlt -Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Membre enregistré
36 messages
Posté le 07 août 2017 - 18:04
Oui, j'ai ma notification et je peux revenir à mon appli sans problème. Tous les traitements fonctionnent en mode background mais dès que l'écran se ferme, tout s'arrête, puis ça redémarre seulement lorsque l'on réactive l'écran.

--
Youri JUTEAU
Montréal
Membre enregistré
797 messages
Popularité : +40 (42 votes)
Posté le 07 août 2017 - 18:21
Hi. For my experience, when you execute a Persistent Thread it is running when you close the activity andthen the Notificación is showed.

Your background processes are launched from the Persistent Thread?

Rubén
Membre enregistré
36 messages
Posté le 07 août 2017 - 19:36
Yes, Windev Mobile have an event that fire when the application go to background. From this event I attach to a persistent thread a notifcation that appear in the mobile. The processing goes perfectly right until the screen is close. The processing stop and restart when the screen switch back to on.

My problem is ony when the screen is turn off. Because at the second the screen goes on, the processing restart in background

Thanks for answering.

--
Youri JUTEAU
Montréal
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 07 août 2017 - 20:53
Bonsoir,

Si j'ai bien compris (tout s'arrête..) le thread persistent s'arrête aussi à la fermeture de la fenêtre ?
Et le thread persistent est lancé depuis cette fenêtre ? Si oui, essayer de le sortir de l’événement de la fenêtre en le plaçant dans le code d'initialisation du projet. Voyez ensuite si le thread s'arrête lors de la fermeture de la fenêtre.

Cdlt- Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Membre enregistré
36 messages
Posté le 09 août 2017 - 13:42
Merci M. Delattre. J'ai tester avec le thread persistant dans l'init du projet mais sans succès.

Je vais voir du côté démarrage d'un service

--
Youri JUTEAU
Montréal
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 09 août 2017 - 16:37
Bonjour Youri,

C'est étrange... Pouvez-vous montrer le code qui déclenche le thread persistent puis celui qui le maintient en vie ?

Par exemple, j'ai ce code dans l'une de mes applications :

Pour démarrer le thread :

Procedure DémarreThreadPersistant()
SI PAS gbIsThreadPersistantActif ALORS
gbIsThreadPersistantActif = Vrai
sThread est une chaîne = "tp" + DonneIdentifiant()
ThreadExecute(sThread, threadContexteGlobal, ThreadPersistantAndroid)
ThreadPersistant(sThread, gNotification)
FIN


et dans la procédure ThreadPersistantAndroid, tant que la condition est vrai le thread continu, sinon il s'arrête tout seul.
Vous avez peut-être un problème du genre...

Procedure ThreadPersistantAndroid()
TANTQUE gnIDTrajet > 0 _OU_ gbIsGeofenceActif = Vrai
Multitâche(-500)
FIN


Ce code tourne sans soucis.
Les procédures doivent être globales.

Bien cordialement,
Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Message modifié, 09 août 2017 - 16:38
Membre enregistré
36 messages
Posté le 09 août 2017 - 21:35
Serait-il possible que se soient les fonctions de géolocalisation qui permettent de maintenir le processus actif lorsque l'écran se ferme.

De mon côté, j'ai des threads qui font tourner des sockets UDP qui s'arrêtent lorsque l'écran se ferme.

J'ai bel et bien la même architecure que vous: je m'étais inspiré de WM Sports pour la persistence.

Et cest parfait (une notification s'affiche, les processus continuent) lorsque l'appli est en background mais dès que l'écran se ferme, tout s'arrête.

--
Youri JUTEAU
Montréal
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 10 août 2017 - 08:07
A priori non, les fonctions de geolocalisation ne permettent pas de maintenir un processus actif lorsque l'écran se ferme.
Lorsque l'application est en background le système peut reprendre (s'entend arrêter les processus en background) à tout moment pour libérer des ressources.

2 pistes toutefois (que je voulais moi même tester lorsque j'aurais eu un peu de temps) :

- J'ai remarqué que les fonctions geofence ( http://doc.pcsoft.fr/?1000019209 ) s'activaient même si l'application est en background (à vérifier).
J'ai remarqué aussi (avec le dernier paramètre = -1) que, même si il n'y avait pas d'entrée ou de sortie d'un périmètre donné, à partir du moment ou on se trouve "dans" le périmètre défini lors du lancement de la fonction, alors la callback était déclenchée régulièrement. Je me suis demandé s'il s'agissait d'un bogue... J'avais alors écris ma propre procédure pour discriminer les entrées/sorties d'un périmètre et surtout ne déclencher qu'une seule fois.
Or, je mettais dis qu'il serait peut-être possible de détourner ce principe pour déclencher (par exemple relancer un processus ou ouvrir une fenêtre régulièrement). Il s'agirait donc de mettre des coordonnées latitude/longitude suffisamment larges pour être certaind'être dans une zone de déclenchement. Vous voyez l'idée ?

- Une autre solution qui fonctionne et qui pourrait être une solution selon votre application, c'est de tester régulièrement si l'application est en ligne.
Par exemple, si votre application est en C/S, passer à True un flag (genre isClientAlive) quelconque dans votre fichier users.
Ce flag doit être remis à False régulièrement par un procédure stockée. Ce process pet être déclenché par un trigger ou une processus périodique programmé sur le serveur. Cette procédure, si le flag est toujours False, indique que l'application est hors ligne. Auquel cas, le serveur envoie une notification transparente (si l'utilisateur ne s'est pas volontairement délogué) et l'application redémarre toute seule.
Cette solution fonctionne à 100% pour l'avoir testé. Certes un peu lourd à mettre en place et dépend aussi de votre application (si elle utilise un système de login, etc...)


Enfin, une chose que j'ai aussi remarqué dernièrement, c'est que, EFFECTIVEMENT, un thread persistent peut s'arrêter tout seul (l'application se ferme alors complètement) sur une version android 7.0. Je n'ai pas remarqué cela sur un android 5.1 par exemple.
J'ai pu observer le phénomène plusieurs fois sans comprendre en comprendre la raison. (Il me semble toutefois que ce phénomène se produisait lorsque je perdais la connexion réseau (passage de wi-fi au réseau suivi d'une perte de réseau sans wi-fi aux alentours). Là l'application se plante complètement et les fonctions de gestion de perte de connexion de WM sont sans effet !
Aussi, quel version d'android utilisez-vous et testez-vous votre application sur différents devices avec différentes version d'android ?

Cordialement,
Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Message modifié, 10 août 2017 - 08:12
Posté le 25 août 2017 - 12:11
Bjr,

Eric67 avait prétendu :
A priori non, les fonctions de geolocalisation ne permettent pas de maintenir
un processus actif lorsque l'écran se ferme.
Lorsque l'application est en background le système peut reprendre (s'entend
arrêter les processus en background) à tout moment pour libérer des
ressources.

2 pistes toutefois (que je voulais moi même tester lorsque j'aurais eu un peu
de temps) :

- J'ai remarqué que les fonctions geofence (
http://doc.pcsoft.fr/?1000019209 ) s'activaient même si l'application est en
background (à vérifier).
J'ai remarqué aussi (avec le dernier paramètre = -1) que, même si il n'y
avait pas d'entrée ou de sortie d'un périmètre donné, à partir du moment ou
on se trouve "dans" le périmètre défini lors du lancement de la fonction,
alors la callback était déclenchée régulièrement. Je me suis demandé s'il
s'agissait d'un bogue... J'avais alors écris ma propre procédure pour
discriminer les entrées/sorties d'un périmètre et surtout ne déclencher
qu'une seule fois. Or, je mettais dis qu'il serait peut-être possible de
détourner ce principe pour déclencher (par exemple relancer un processus ou
ouvrir une fenêtre régulièrement). Il s'agirait donc de mettre des
coordonnées latitude/longitude suffisamment larges pour être certaind'être
dans une zone de déclenchement. Vous voyez l'idée ?

- Une autre solution qui fonctionne et qui pourrait être une solution selon
votre application, c'est de tester régulièrement si l'application est en
ligne.
Par exemple, si votre application est en C/S, passer à True un flag (genre
isClientAlive) quelconque dans votre fichier users.
Ce flag doit être remis à False régulièrement par un procédure stockée. Ce
process pet être déclenché par un trigger ou une processus périodique
programmé sur le serveur. Cette procédure, si le flag est toujours False,
indique que l'application est hors ligne. Auquel cas, le serveur envoie une
notification transparente (si l'utilisateur ne s'est pas volontairement
délogué) et l'application redémarre toute seule.
Cette solution fonctionne à 100% pour l'avoir testé. Certes un peu lourd à
mettre en place et dépend aussi de votre application (si elle utilise un
système de login, etc...)


Enfin, une chose que j'ai aussi remarqué dernièrement, c'est que,
EFFECTIVEMENT, un thread persistent peut s'arrêter tout seul (l'application
se ferme alors complètement) sur une version android 7.0. Je n'ai pas
remarqué cela sur un android 5.1 par exemple.
J'ai pu observer le phénomène plusieurs fois sans comprendre en comprendre la
raison. (Il me semble toutefois que ce phénomène se produisait lorsque je
perdais la connexion réseau (passage de wi-fi au réseau suivi d'une perte de
réseau sans wi-fi aux alentours). Là l'application se plante complètement et
les fonctions de gestion de perte de connexion de WM sont sans effet !
Aussi, quel version d'android utilisez-vous et testez-vous votre application
sur différents devices avec différentes version d'android ?

Cordialement,
Eric.


J' utilise des Th_persistants sur deux applis differentes, qui ont
tourné sous Android, 4.x 5.x 6.x et 7.0 et les threads ne s'arretent
JAMAIS.
J' ai eu des threads arretés au tout debut en beta de ces applis, mais
maintenant, ils ne s'arretent plus

Heureusement que ca peut marcher sans faille, imaginer les fonctions
tel qui s'arretent quand l'ecran s'eteint !!!

a plus

--
-------------------------------------------------------------
www.ctc-soft.com
Gestion biblo-documentaire (free-share)
Comptabilité shareware
Logiciels de Gestion de saisie terrain
Spécialisé Tournées de boulangers
-------------------------------------------------------------
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 25 août 2017 - 15:19
Dc a écrit :

J' utilise des Th_persistants sur deux applis differentes, qui ont
tourné sous Android, 4.x 5.x 6.x et 7.0 et les threads ne s'arretent
JAMAIS.
J' ai eu des threads arretés au tout debut en beta de ces applis, mais
maintenant, ils ne s'arretent plus


Bonjour,

Je confirme. Dans l'application en question j'ai extrait la partie persistantes et la fait tourner sur 2 mobiles de test.
Résultat, jamais d'arrêt !

Il y a donc un bogue quelque part dans mon appli qui reste à découvrir.

Cordialement,
Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Membre enregistré
77 messages
Posté le 10 février 2018 - 14:39
Bonjour,
alors comment avez vous résolu le problème de la veille?
Merci
Message modifié, 10 février 2018 - 14:40
Membre enregistré
77 messages
Posté le 10 février 2018 - 19:18
De plus, le threadpersistant se ferme seul de temps en temps!!!! (android 7.0).

--
Debutant