Anniversaire
Voici
un petit programme illustrant tout ce que j'ai pu raconter (ou à
venir) sur le développement sous Android.
Les activités
MainActivity: C'est l'activité principale (d'où son nom...). Utilisation d'une image en background en drawable et drawable-land.
AProposDeActivity: A propos de l'application, activité très simple qui va:
- Mettre en oeuvre un TextView pouvant gérer automatiquement un lien vers un site (en l'occurence supertos.free.fr !) (cf. layout a_propos_de.xml.)
- L'utilisation d'une intention implicite permettant de lancer un navigateur quelconque afin que l'utilisateur puisse connaître la dernière version de l'application. Cette fonction étant disponible suite à un clique sur le bouton version impliquant l'utilisation d'un listener OnClickListener.
- L'utilisation du PackageManager afin de connaître et d'afficher la version de l'application en cours.
ParamActivityAlarm: Permet de paramétrer l'heure utilisée par le service ServiceCtrlAnniversaire exécuté par les alarmes pour lancer des contrôles de dates d'anniversaire avec celle du jour.
- Utilisation de l'objet timePickerAlarm.
- Lancement d'une intention explicite sur un service afin de relancer les alarmes.
- La détection de clique sur des boutons pour effectuer une opération associée (Ici les boutons valider/annuler)
ParamActivityRappel: Permet de paramétrer la durée entre une alarme et les rappels.
- Utilisation de l'objet timePickerAlarm.
- Lancement d'une intention explicite sur un service afin de relancer les alarmes.
- La détection de clique sur des boutons pour effectuer une opération associée (Ici les boutons valider/annuler)
ParamActivityNotif: Permet de préciser comment un utilisateur sera informé des anniversaires
- Utilisation d'objets boutons toggle (interrupteur on/off) pour paramétrer les notifications qui peuvent être envoyées
- La détection de clique sur des boutons pour effectuer une opération associée.
ImportExportActivity: Permet de sauver les données de la base sous forme de fichiers XML zipés sur la carte SD et de les recharger. L'écran est volontairement bloqué en mode portrait par code.
ListEventActivity: Donne dans une liste l'ensemble des évènements (anniversaires) que l'utilisateur a enregistré pour lancer une activité de consultation/modification d'un évènement. Permet aussi la suppression ou la création de nouveau évènement.
- Personnalisation d'une liste (cf. MyListAdaptater).
CreationEventActivity: Création/modification/consultation du détail d'un évènement.
- Utilisation du Widget Date pour saisir la date d'un évènement.
- La détection de clique sur des boutons pour effectuer une opération associée.
- Saisie dans des widgets editText, checkBox.
- Exemple de onSaveInstanceState et de Bundle.
- AlertDialog pour afficher un message d'alerte.
- Drawable pour afficher la photo d'un contact sur un widget bouton.
Pratiquement toutes les activités auront à traiter:
La sauvegarde et la restauration des données saisies en cas d'arrêt de l'activité/relance: onSaveInstanceState.
L'utilisation de tables SQLite pour affecter des objets à l'écran avec des valeurs ou pour enregistrer les saisies faites via bean et DAO.
Les services
Trois services sont créés:
Le premier est ServiceAutoRun: C'est à lui que revient la programmation des alarmes qui permettra le lancement du contrôle d'anniversaire à un moment T.
- Il sera lancé automatiquement à la fin du boot d'un device android (voir plus loin le broascast receiver).
- Il programme les alarmes (Soit une alarme simple, soit une alarme avec répétition et annulation des alarmes précédemment programmées). Ce qui implique la création d'une intention explicite sur un nouveau service (le second vu plus loin) et la création d'un PendingIntent pour permettre le lancement de ce service au nom de l'activité courante.
- Il peut être lancé par une activité et traite pour cette raison un paramètre passé en extra : "CHANGE" si vrai force la relance des alarmes (exemple de code lançant le service sous CreationEventActivity qui relance les alarmes si déjà passées, suites à la création d'un contact le jour même).
Le second service est ServiceCtrlAnniversaire: C'est lui qui va indiquer les anniversaires par notification s'il y en a à fêter.
- Utilisation d'un thread Runnable et d'une gestion de messages (handler) lancée pour éviter un ANR sur l'UI Thread afin d'effectuer le contrôle de l'existance d'au moins un anniversaire à l'un instant courant.
- Creation d'une notification (Texte, vibration et musique) si au moins un anniversaire à fêter. D'où l'utilisation d'une intention explicite et PendingIntent vers l'activité principale de l'application.
- Là aussi relance éventuellement d'un service, le précédent...(intention explicite et PendingIntent) pour reprogrammer une alarme.
Le troisième service est ServiceUpdateAppWidget: Il a en charge de récupérer les enregistrements anniversaires en cours ou, s'il n'y en a pas, la liste des futurs anniversaires afin de mettre à jour le contenu de l'AppWidget Anniversaire en conséquence.
- Utilisation d'un thread Runnable pour éviter un ANR et maj du contenu de l'appWidget.
BroadCast receiver
BroadcastReceiverAutoRun: cette classe permet de lancer un service à la fin du boot d'un device android. Utilisation startServiceIntent sur une intention explicite.
AppWidget
WidgetConfigureActivity: Non vraiment exploité pour le moment. Configuration d'un AppWidget déposé sur l'écran d'accueil.
AnniversaireWidget: AppWidget simple qui permet d'afficher les anniversaires en cours ou ceux qui vont bientôt arriver.
Autres classes
Des classes pour gérer la base de données SqLite.
SqLiteAnniversaire pour une connexion à la base.
DaoAnniversaires et autres classes DAO, DAOFactory et les beans qui vont bien (BeanAnniversaires, BeanEtat, BeanParametres): une solution pour résoudre le problème évoqué entre des bases de données SQL et le développement orienté objet.
AnnivSqLiteOpenHelper pour gérer la connexion, création et l'alimentation de la BdD.
LogAnniv, une classe pour gérer des logs.
FiltreNom permet de filtrer les fichiers pour n'avoir que les .xml. Utilisé suite à l'exportation (XmlAnniversaire) des données de la base pour zipper (ZipAnniversaire) les fichiers .xml
XmlAnniversaire permet de lire/écrire des flux XML. Détection d'une carte SD pour création de répertoire anniversaire qui contiendra les données xml (éventuellement zippées).
ZipAnniversaire pour zipper/dézipper des fichiers.
MyListAdaptater personnalisation du contenu de la liste ListEventActivity.
ContactAnniv récupération d'informations sur un contact.
Le code
Source:et
l'exécutable (apk) zippé
ou installable
.
Pour installer les apk, n'oubliez pas d'autoriser les sources
inconnues !
Pour recompiler le projet, créez un projet android application project avec application et projet nommés Anniversaire et un package à fr.free.supertos.anniversaire
Une fois le projet créé, supprimez le répertoire res, src et le fichier AndroidManifest.xml
Il ne reste plus qu'à y mettre le contenu du zip à la place et à rafraichir le projet...
Bug
J'ai oublié de raffraichir l'affreux appWidget disponible éventuellement sur l'écran d'accueil. Donc si vous n'arrêtez pas votre portable, la liste des anniversaires affichée ne se mettra pas à jour le lendemain...
L'ergonomie
Tout cela pourrait être bien plus beau à l'affichage. Mais ce n'était pas forcement le but recherché ici dans la version 1.03 !