Aller au contenu

[Questions+Architecture] Diverses questions pour mon futur dev


Burn2

Recommended Posts

Bonjour à tous et toutes!!!!

Je m'en viens quérir votre aide afin de bien construire mon application en me servant au mieux de l'architecture d'android.

Alors tout d'abord le contexte:

Je suis une véritable quiche lorraine en java (c'est même peut-être une insulte pour elle! :D) donc il va falloir que j'améliore clairement tout ça. Je suis déjà en train de lire les territoriaux pour me remettre un peu dans le bain.

IL faut savoir que lors de ma formation j'ai déjà fais un peu de java, mais ça n'a jamais été dans ma logique, je perdais pas mal de temps pour faire ce que je voulais faire, à chercher toujours les fonctions là ou elles ne sont pas. Bref comme c'était dans ma formation j'ai juste fait ce qu'on me demandé, puis je me suis empressé d'oublier vu que je n'y voyais pas vraiment de but final, mon langage de prédilection étant le C++ et associé au QT j'ai toujours réussi à faire ce que je souhaitais avec cette sensation de tout trouver sans chercher, en gros ça correspondait à ma logique.

Voilà un peu pour le contexte. :)

Maintenant, que je possède un téléphone android, me voilà avec une ptite idée de développement, oui mais voilà c'est java! Donc javaqu'a bien retenir. :D Faut que je révise les bases et reparte sur de bonnes bases, donc pour l'instant je lis des docs java et quelques informations sur l'architecture d'android. :)

Donc voilà maintenant que tout est bien posionné sur moi, je m'en vais poser quelques questions pour mon développement.

Tout d'abord niveau service j'ai trouvé ce tutorial:

https://forum.frandroid.com/forum/viewtopic.php?pid=190511

Qui va déjà me permettre de réaliser un service qui démarrera tout seul au boot. ça tombe bien ça fait partie de ce que je cherchais à faire.

Je souhaite faire une application en deux parties, un service qui tournera en arrière plan et fera des actions à des moments données, et une autre application qui me permettra de stopper le service et de configurer en graphique le service (paramétrer diverses choses, en gros le service en démarrant récupèrera dans un fichier texte sa configuration et c'est cette configuration là que génèrera l'application graphique).

Maintenant diverses question sur les services associés à android:

*Si je fais un sleep de 24h dans le service, ce service n'utilisera plus de ressource durant 24h on est bien d'accord? Y a t'il une meilleure solution pour mettre en pause le service durant une durée?

*Le service continue t-il à fonctionner quand le téléphone est en "veille"?

*Avez vous un tutoriel pour commander le service? (le redémarrer/stopper ou démarrer tout simplement)

*Pensez vous mon découpage judicieux? (à savoir une application contenant juste le service, et l'autre l'appli graphique? Mon choix partant surtout du principe d'utiliser le moins de ressource possible dans mon service et surtout de commencer par réaliser le service l'application graphique étant pour la prochaine fois).

Voilà merci d'avance et pardon pour le roman! :)

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 63
  • Créé
  • Dernière réponse

Top forumeurs sur ce sujet

1 : le sleep -> poubelle.

définit une alarme avev l alarmmanager qui lancera ton service dans 24H, et une fois lancé redéfinit une nouvelle alarme dans 24H.

2 : le service sera en sommeil quand le tel sera en veille. mais comme tu auras définit une alarme le probleme disparait (avec l alarme créee avec les bon parametres pour qu'elle reveille le processeur si besoin)

3 : cherche sur le forum pour le service

4 : tu peux mettre le service et l appli dans la même appli....

Lien vers le commentaire
Partager sur d’autres sites

Merci pour votre réponse (tien un bordelais en plus! :) )

Effectivement l'alarme semble convenir dans le principe mais pas tellement dans le fonctionnement.

En fait mon application se réveillera à certains moment programmé, donc quand je dis 24h c'était un exemple, mon but sera de pouvoir mettre en sommeil le service pour qu'il ne se réveille que lorsque souhaité, c'est pour ça que je parlais de méthode sleep. Mon but n'est pas de lancer mon service que dans 24h c'est une fois le service lancé qu'il devra se mettre en pause durant X minutes (voir heures) avant de refaire un tour de boucle.

Relancer le service ne me semble pas trop judicieux dans le sens ou lors de son lancement il récupèrera la conf et organisera tout ce qui va bien pour ne plus consommer que ce qui est réellement nécessaire, donc le lancer dans X minutes ne me semble pas trop judicieux, et en plus je ne pourrais pas stocker les état durant les tours de boucle. :/

Y a t'il une autre solution?

Pour le 4 est ce vraiment judicieux du point de vue ressource? Je veux dire, le problème c'est que si on kill l'application via cleanoid ou autre, mon service va dégager avec non? (d'ou l'intéret de séparer les deux pour que le service lui puisse continuer à tourner même si on clean l'interface graphique qui une fois configuré ne dois plus servir en fait.

EDIt: hum au final tu as peut-être raison, je prends sans doute la chose dans le mauvais sens.

Je vois une idée avec les alarmes directement, mais je ne sais pas si c'est jouable et pas forcément globalement.

Le problème ça va être pour annuler une alarme programmée, et comment gérer tout ça. Bref il faudrait peut-être que j'explique un peu plus mon projet, mais j'espérais pouvoir le sortir d'un coup finalisé.

En restant flou, voici ce que j'ai besoin de faire:

Mon service devra faire des actions au début et à la fin d'une plage donnée. (exemple je définie dans mon fichier de conf une plage de 10h à 20h le lundi, et par exemple à 10H il va se lancer sauvegarder un état et faire une modification (admettons qu'il mette en marche la 3G) puis à 20h il va remettre à l'état initial d'avant 10h.

Je pensais donc faire un service qui se met en pause jusqu'au prochain palier.

C'est clair dans ce que je voudrais faire ou pas du tout?

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

1. Lire http://d.android.com/guide/topics/fundamentals.html

2. Poser des questions ici pour les choses qu'on ne comprend pas.

3. Répéter 1 et 2 jusqu'à ce qu'on ait compris comment marche un service android

L'OS se charge de gérer la mémoire et les ressources et le fera toujours bien mieux que nous.

La notion de service est très précisément encadrée par le framework.

Un service ne tourne JAMAIS en permanence, on demande au système de le déclencher au moment où c'est nécessaire.

Si un service est tué par un task killer, il sera relancé par le système à la prochaine alarme programmée.

Modifié par Nivek
Lien vers le commentaire
Partager sur d’autres sites

Merci pour ces liens, je vais lire ça, j'en ai profité pour expliquer un peu plus mon projet en éditant.

EDIT: je vais essayer de me documenter un peu plus sur les services, de ce que je comprends sur ce que tu me dis, en fait on met un service en pause, et c'est l'os qui va le réveiller via un event? (que ça soit à cause d'une alarme programmée ou autre?).

Enfin de toute façon, il faut clairement que je me documente mieux sur la plateforme android, parce que là j'ai clairement de grosses lacunes.

EDIT2: hum un bon tuto que voilà, c'est déjà plus clair sur la méthode pour réveiller mon service et faire ce que je veux:

http://android-france.fr/2009/11/26/developpez-votre-propre-reveil-alarme-avec-votre-android-phone/

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

Bon j'arrive progressivement à avancer vers ce que je veux. :) Grâce au tutoriel marqué plus haut j'ai déjà mon service, via eclipse c'est clairement plus facile pour faire son design et j'ai déjà trouvé quelques bases pour mon projet, donc tout s'annonce pour le moment bien en théorie. (en pratique il va rester l'histoire de la mise en veille pour vérifier que tout se passe bien).

J'ai un exemple de réception d'évènement d'alarm (du moins l'interception) mais je ne vois pas trop comment le lier à mon service. :/ Bref c'est un peu totalement flou sur comment lancer mon service, comment vérifier qu'il tourne et comment faire en sorte qu'il attende l'évènement de l'alarm.

les exemples de codes que je trouve sont tous un exemple d'une partie, et ou je ne sais pas comment un des éléments a été récupéré. :(

EDIT: non y a pas mon service ne démarre pas en fait.

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

Hum en fait non, je n'arrive pas à concilier les deux.

j'ai un exemple de service qui marche au niveau du tutoriel. Mais je ne peux être sûr qu'il se lance réellement. :/ Je teste au niveau de la vm mais je ne vois rien. :( Aucun moyen de savoir si le service se lance réellement.

IL me manque quelques points pour bien pouvoir tester et avancer.

EDIT: non en fait mon service ne démarre pas du tout. (j'ai mis une notification dedans et rien il ne se passe absolument rien. Comme si le service ne démarrait pas).

EDIT2: c'est bon j'ai trouvé comment le lancer! Et j'ai bien ma notification donc c'est bon ça se lance bien. :)

Mais j'ai du mal à saisir comment faire pour faire passer les paramètres tout ça. :/

Il n'y a pas moyen de mettre le broadcast receveir dans la classe du service pour réveiller le service? Parce que là je suis bloqué avec deux classes à part et je ne sais pas trop comment m'envoyer des variables etc. :/ Je ne saisie pas trop la construction en fait.

EDIT3: je suis décidément une quiche, suffit que je mette tout dans le broadcastreceiver tout simplement, et du coup dans le service il n'y aura plus rien mais ça ce n'est pas gênant. :)

EDIT4:

VOus auriez une doc claire sur la représentation parce que j'ai du mal à vraiment bien saisir. :/ J'ai mon service, j'ai mon broadcast receiver, donc si je mets dans le service une alarme c'est bien mon broadcast receiver qui récupère le tout, mais j'ai du mal à saisir comment continuer ensuite dans le déroulement, le broadcast receiver va pouvoir replanifer une alarme? ESt ce qu'au prochain "top" de l'alarme il aura encore ses données personnelles initialisées ou ça repart à 0?

De plus je n'ai pas vu de méthode on start permettant de savoir qu'on commence juste le broadcastreceiver, du coup je suis assez perdu. :(

A la réception de l'alarme ça se passe comment concrètement et clairement?

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

JE rerécapétète ce que j'ai crus comprendre.

Donc j'ai mon service, il va soumettre une alarme au système.

Ensuite il est en pause. (le téléphone est en veille par exemple).

Lors du déclenchement de l'alarme (event donc) c'est le broadcast receiver qui reçoit la notification, c'est donc le point d'entrée lors de l'event.

Mais ensuite le service reprend-il la main? Il se passe quoi ensuite??? On retombe ou? Où peut-on faire nos traitements qui doivent se suivre?

(je suis bien sûr sur cette page pour comprendre: http://wiki.frandroid.com/wiki/Principes_fondamentaux + des recherches google)

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

Bon j'étais parti pour faire un bind vers mon service, sauf qu'impossible de créer le fichier aidl. :( JE n'ai rien pour le faire dans le dossier tools du sdk sous linux. Et dans eclipse forcément toujours rien pour pour en créer un non plus.

C'est bien valable pour android 1.5 aussi non?

EDIT: PUNAISE Mais c'est pas vrais! J'ai eu la bonne idée de faire un switch android 1.5 android 1.6 dans eclipse, et toutes mes sources ont disparues! je n'ai plus rien dans mon répertoire de mon projet! Punaise non je suis deg complet là! Foutu bug de M$$$$$ . Une journée complète de perdue à cause d'eclipse. :'(

EDIT2: bon j'ai tout rédeveloppé.

Et j'ai testé, si je kill mon application depuis task killer, mon service est tué avec et l'alarm ne le relance pas du tout comme dit plus haut! :( Donc ça ne fait clairement pas ce que je veux au niveau du service.

Quelqu'un pourrait me donner une solution pour que le service continue à tourner ou pour séparer le design du service au niveau process de cleanoid?

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

En fait non, je pense que tu ne me suis pas.

Pour moi je sépare le service, qui lui si l'utilisateur le kill ok, ça c'est normal c'est son choix. Mais bon dans ce cas autant dégager l'application, car le but de l'application est de tourner en arrière plan afin d'automatiser certaines tâches. Par contre la partie graphique prend en ram inutilement. ET ça ça peut-être dégagé puisqu'une fois configuré ça ne sert plus à rien le reste du temps (à part activer de temps en temps des profils).

C'est un peu comme le programme réveil, pour moi le service de reveil devrait pouvoir tourner sans l'interface graphique. Et dans mon projet ça revient au même, c'est con de programmer une alarme pour être réveillé pour tuer le processus qui va pouvoir réceptionner l'alarme, dans ce cas autant ne pas en soumettre. D'où mon questionnement sur le séparer le service de l'interface graphique afin de ne pas gaspiller de ressource.

Donc pour en revenir ou j'en suis, j'ai réussi à lancer un service (il faut que je vérifie qu'il démarre bien tout seul au boot). J'ai réussi à intercepter l'alarme.

Mais maintenant je ne sais pas comment remonter dans le service, je pensais à un bind dans le broadcast sauf que pour les bind faut faire un fichier .aidl, et que dans eclipse je n'ai aucun moyen d'en créer un, et si je fais un fichier texte noté .aidl ça ne marche pas non plus. :(

Du coup comment faire?

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

En fait ce n'est pas tout à fait ça le problème.

Pour être plus clair, mon service démarre. Puis une fois démarré il reçoit une alarme (donc qu'on à programmé à telle heure) puis va faire une action à la suite, et va programmer tout seul la prochaine alarme pour remettre le contexte comme avant.

Le but de mon application est de faire des profils qui vont se lancer durant une période donnée. Exemple: mettre le téléphone en mode silencieux de 22h à 6h30 du matin etc. Donc j'ai besoin que mon profil sache ou il en est et continue sa vie pour remettre l'état comme avant le changement pour ce profil là.

Le problème c'est que là j'ai du mal à tout saisir comment tout se goupille.

Normalement je le vois comme ça: le service se lance, récupère la conf et les profils, puis planifie l'alarme pour le début du premier profil. Mais ensuite je ne vois pas comment continuer l'enchainement! :(

J'ai juste besoin de savoir comment depuis mon broadcast receiver je peux revenir à mon service pour qu'il continue son action. D'ou le bind.

Dans mon eclipse je n'ai pas ce qu'il faut pour faire le fichier aidl. Ni dans mon sdk android, je vais le retélécharger possible que je me traine une vielle version du sdk. (au niveau tools)

EDIT/ j'ai retéléchargé le sdk je n'ai toujours rien dans tools pour les fichier aidl. Et dans eclipse il ne me propose toujours rien pour en créer un. :'( je ne comprend vraiment pas comment faire.

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

moi je les fait à la main et ça compile tout seul....

pour ton probleme de profil : en gros profil A son coupé de 22H à 1H....

t es pas obligé de le coder comme tu l'énnonce...

tu peux coder:

- profil A à 22H couper le son

- profil B à 1H mettre le son

ce qui donne le meme resultat.

pour savoir quoi faire tu n'a plus qu'à mettre l action dans l intent du profil qui va se lancer:

tonIntent.setData(Uri.parse("/couper_son/"));

et dans le onStart du service:

if(intent.getData().toString().contains("/couper_son/"))

{

couper le son

}

pas besoin de bind ou autre....

Lien vers le commentaire
Partager sur d’autres sites

Sauf que le problème ça va être pour connaitre l'état d'avant le profil couper le son.

Ce n'est clairement pas l'idéal à mon sens, surtout si je veux rajoute d'autres actions que couper son et si je veux laisser des paramétrages à l'utilisateur. :/

Si tu me dis qu'en créant le fichier aidl à la main ça marchera, je testerais donc comme ça, ça me semble le plus logique de faire avec un bind pour lancer une fonction du service, service qui a tout l'historique et qui a l'enchainement des états.

Lien vers le commentaire
Partager sur d’autres sites

Les services qui tournent en permanence sont à éviter au maximum (gros impact potentiel sur les performances et la batterie). Ne peux-tu pas stocker les informations qui t'intéressent dans une base de données ?

Modifié par Nivek
Lien vers le commentaire
Partager sur d’autres sites

Par qui tourne en permanence je veux sous en tendre qui reste en standby en permanence.

Je ne vois pas trop le problème en partant du principe qu'on peut le mettre en pause et qu'il ne consomme plus rien. (genre le sleep ou autre).

Mon service ne fera pas des actions en permanence, le but est qu'il soit lancé en permanence mais qu'il se réveille sous des actions. Donc jusqu'a présent ce qu'on commençait à arriver à faire me semblait correcte au vue de ce que vous m'avez dit et ce que j'ai lu sur les services.

Concrètement ce que j'aimerais faire, personnellement je l'imagine comme cela, maintenant si ce n'est pas possible je verrais pour la base de donnée embarquée etc, mais ça me semble encore plus lourd??? Donc bref en gros comment je l'imagine:

Le service se lance, récupère les profils, puis programme une alarme pour telle heure.

Le service s'endort (possible? Y a une manière de le faire? J'ai crus comprendre que c'était le but du service dans toutes les doc??? )

L'alarme réveille le service (donc via le broadcast receiver et dans le broadcast je bind vers le service pour lancer une fonctions du service) puis il sauvegarde le contexte et lance les paramètres du profils puis planifie la prochaine alarme qui va le réveiller et donc retourne en standby.

Ainsi normalement il ne doit pas consommer de ressource sauf durant ses phases de réveils et à part utiliser un peu de ram (rien de grave sur un service de ce genre là) logiquement dans ma théorie c'est sensé ne plus rien utiliser.

Ce n'est pas possible de le faire comme cela sous android? J'ai du mal à saisir l'intérêt du service sinon? :??:

Mais peut-être qu'il faut que je revois ma manière de penser et que ce que j'imagine n'est pas possible et que donc il faut passer par une table ou autre chose qui consommera au final moins?

(merci de votre aide à tous les deux :) )

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

Justement je veux éviter de sauver dans un fichier ou une bd l'état d'avant, je trouve ça affreusement crade. :/

J'ai du mal à arriver à comprendre comment tout se goupille. :'(

Est ce que quelqu'un pour m'expliquer (ou me passer un lien vers une doc) qui explique clairement le cycle de vie du service ainsi que ce que tu souhaites me faire faire?

Là j'ai l'impression que j'ai un service, il se stop (donc pas en pause même bel est bien stoppé et terminé), le broadcast receiver récupère l'event de l'alarm puis va redémarrer le service via une url "bizaroïde" ou on lui passe les paramètres et le service va redémarrer???

J'ai bien compris "globalement" la solution proposée??? Et donc je suis obligé de sauvegarder mon context et mes profils dans des prefs ou bases ou autre à l'arrache et passer mon temps à chaque alarm à faire des accès dessus avec mon service qui va passer son temps à se relancer (vu que tu me parles de la méthode onstart() )???? Il n'y a que moi que ça gêne ou c'est que je n'ai pas saisis un truc???

Il n'y a aucun moyen de faire proprement ce que j'envisage? Parce que là clairement j'ai l'impression qu'a aucun moment un bout de code n'a le moyen de connaitre l'historique ni n'a de vision globale.

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

pas mieux que nivek.... t'as tout compris.

ton broadcast va lancer le service qui va faire son action et se terminer proprement. il se relancera à la prochaine alarme.

dans son action il peut aller consulter une pref de l ancien etat..ou lire l etat actuel et le sauver dans une pref et changer l etat.

après quoi il meurt en beauté. pour revivre à la prochaine alarme.

pas de bind, pas de code super tordu.

ZERO conso....

pour les cycles de vie:

http://android-developers.blogspot.com/2010/04/multitasking-android-way.html

Lien vers le commentaire
Partager sur d’autres sites

Ah ça me rassure à la fois (d'avoir compris) tout en ne me rassurant pas car c'est très loin de la solution que j'imaginais. :D

Mais ça ne va pas être un peu "lourd" de stocker les états, et ce que j'aurais gardé en temps que variable en dur?

ça vous semble être la meilleure solution ou c'est tout simplement la seule solution imaginable?

Parce que j'ai peur qu'à chaque réveil d'alarme ça soit plutôt chargé niveau calcul (le temps de charger le contexte précédent, de trouver le contexte suivant et de l'appliquer etc).

EN tout cas merci de votre aide. :) ça prouve qu'il faut vraiment que je comble toutes mes lacunes!

J'ai vu un livre qui vient juste de sortir sur le développement et l'archi d'android qui m'a l'air moultement intéressant, je vais voir pour me l'acheter. :) (ça vous évitera peut-être à ne plus avoir à répondre à des questions de newbe qui doivent vous "souler" à force ;) )

Lien vers le commentaire
Partager sur d’autres sites

  • 2 weeks later...

Punaise, en réfléchissant à l'algorithme c'est chaud tout de même, surtout à cause des changements de jours. (si mon profil est à cheval sur deux jour c'est galère).

Ou alors il faut vraiment que je me limite à une fonction toute simple et puis basta, parce que là c'est galère tout de même. :D

Mais quand bien même faut que je gère le démarrage de l'application en cours de profils (téléphone redémarré ou éteint puis allumé).

Ce n'est guère facile tout ça. :D

moi je les fait à la main et ça compile tout seul....

pour ton probleme de profil : en gros profil A son coupé de 22H à 1H....

t es pas obligé de le coder comme tu l'énnonce...

tu peux coder:

- profil A à 22H couper le son

- profil B à 1H mettre le son

ce qui donne le meme resultat.

pour savoir quoi faire tu n'a plus qu'à mettre l action dans l intent du profil qui va se lancer:

tonIntent.setData(Uri.parse("/couper_son/"));

et dans le onStart du service:

if(intent.getData().toString().contains("/couper_son/"))

{

couper le son

}

pas besoin de bind ou autre....

EDIT: ça devrait être possible comme ça, mais c'est chaud, j'ai du mal à me faire une vision de la chose surtout niveau algo c'est pourtant vers ça qu'il faut que j'aille.

EDIT2: c'est bon j'ai la vision de la chose, je vois comment faire en fait bien que ça ne soit clairement pas l'idéal, en mémoire avec une vue globale c'est quand même bien plus facile et vaste!

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

J'ai un petit problème de perception, je fais comment dans mon broadcast receiver pour relancer mon service?

il ne veut pas de mon start service. Il me dit qu'il n'existe pas de méthode pour le faire, alors que dans un activity ça marche??? Il faut inclure quoi?

EDIT: j'ai trouvé pour le start service, il me reste un problème avec l'intent.

j'ai du mal à saisir, j'arrive à me passer un mode (comprendre un chiffre quand je fais un setdata) mais lors du premier boot, il n'y a rien de passé, je fais comment pour tester si "j'ai rien mis dedans"???

J'ai testé la taille, j'ai testé si en chaine de caractères c'est = à "" mais non quand je n'ai rien mis dans l'intent il n'est visiblement pas vide.

C'est quoi l'astuce pour que tout se passe bien???

Je ne me vois pas faire un if en cascade, je me voyais plus avec un switch et ne me passer que le mode (0 1 2 3 ...)?

Modifié par Burn2
Lien vers le commentaire
Partager sur d’autres sites

Vous faites comment avec l'intent???? je galère et impossible de passer quoi que ce soit avec putextra ça plante à chaque coup. :(

Je ne vais pas faire des contain avec chaque cas quand même ça ne me semble pas du tout propre, il y a bien moyen de faire ça clairement non?

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.




×
×
  • Créer...