Développez votre propre réveil pour android
J’ai été invité par Android-France à rédiger le tutoriel Android que voici.
Le tutoriel ci dessous permet d’avoir un aperçu vraiment global du service de gestion d’alarme d’Android, l ‘AlarmManager.
Dans ce tutoriel vous retrouverez donc des utilisations des classes et interfaces suivantes :
- AlarmManager : Classe qui donne accès au service d’alarme du systeme. Permet de programmer l’éxécution d’un code à un moment précis.
- BroadcastReceiver : Classe qui reçois le code à exécuter après le déclenchement d’un évènement (ici au déclenchement du réveil).
- Serializable : Interface qui permet de la sérialization d’un objet c’est à dire sa sauvegarde sous forme de fichier.
- TimePickerDialog : Affiche un dialogue à l’utilisateur pour lui demander de saisir l’heure souhaité.
- OnTimeSetListener : Interface a implémenter pour décrire le code à exécuter suite à la saisie de l’heure.
La fonctionnalité qui m’a vraiment plus dans ce tutoriel et qui est très utile c’est la possibilité d’ajouter du code à exécuter au démarrage du téléphone. Dans notre cas présent, pour réactiver le réveil au démarrage du téléphone.
Bref, pour le tutoriel, cela se passe sur android-france.
Dans le même style ::
Super tuto d’ailleurs !
Mais pourrais-tu pousser un peu plus loin et faire démarrer une activité à ton réveil ? Parce que je n’y arrive pas, cela me lève des exceptions…
J’ai mis
Intent intentToLaunch = new Intent();
intentToLaunch.setClass(context, AlarmReceiverDisplay.class);
context.startActivity(intentToLaunch);
mais … pffff…. plantade
Merci !
En fait si tu veux lancer une nouvelle activité à ton réveil, tu peux.
Ton code est juste, mais il manque juste une ligne de code.
Le code qui te correspond doit être :
En effet, je sais pas si tu as regardé l’exception qui est levée, mais elle te dis en gros que si tu veux lancer une nouvelle activité en dehors d’une activité, il faut que tu mette le flag FLAG_ACTIVITY_NEW_TASK .
Si tu as d’autre question ou autre n’hésite pas à demander.
Râââââââhhhhhhh ….
J’étais pas loin !!
Merci beaucoup pour ton aide !!!!
Salut,
d’abord, merci pour ce tuto.
J’ai une erreur lors de la sauvegarde du fichier sérializé, en fait j’ai une java.io.NotSerializableException: android.text.format.Time
si tu as une idée
merci d’avance
laurent
hum , dsl pour cette question un peu stupide, forcement ça marche pas puisque cette classe android.text.format.time n’impelemnte pas Serializable …. faudra juste utiliser à la place java.utils.calendar
++
@bunjX
J’ai exactement le même problème et j’ai utilisé le bout de code que tu as donné et qui compile dans un autre contexte identique (de BroadcastReceiver où je veux lancer un intent). Malheuresement au lancement, j’ai l’exception :
android.content.ActivityNotFoundException: Unable to find explicit activity class {com.hugoboss.userinterface/com.hugoboss.communication.ReceiveSMS}; have you declared this activity in your AndroidManifest.xml?
Ma classe ReceiveSMS est : ReceiveSMS extends BroadcastReceiver
Dans mon androidmanifest.xml, j’ai pour l’instant :
Ce qui est normal mais alors si j’essaie de corriger suivant l’erreur qu’il me dit avec ca :
Eclipse me dit que :
com.hugoboss.communication.ReceiveSMS does not extend android.app.Activity
Ce qui est bien normal mais comment faire alors ?
Merci de ton aide
petite question :
à quoi sert le « private static final long serialVersionUID = 1L; »
dans Alarm.java ???
où est implémenté sauver() (dans Reveil.Java) ?
heureReveil += alarm.getHeure().hour >10 ?
devrait être :
heureReveil += alarm.getHeure().hour >9 ?
idem pour heureReveil += alarm.getHeure().minute >9 ?
non ?
@cousinHub
le paramêtre serialVersionUID est à ajouter lorsqu’une classe implemente Serializable.
Les méthodes charger() et sauver() se trouve dans l’Activité Reveil.java
@cousinHub
Oui c’est une erreur de ma part.
Il faut bien mettre :
heureReveil += alarm.getHeure().hour > 9 ? alarm.getHeure().hour : « 0″ + alarm.getHeure().hour;
idem pour les minutes.
@BONNET Ludovic
En fait je ne vois pas le code de ton manifest.
Mais si j’ai bien compris tu souhaite lancer un Intent.
Si tu reprend le code décrit sur ce commentaire c’est que tu souhaite lancer une Activité (Activity). Dans ce cas ta classe ReceiveSMS doit étendre Activity et non pas BroadcastReceiver.
J’ai bien compris ta demande?
Oui tu as compris sauf que ma classe étend BroadcastReceiver car elle doit attraper des événements et lancer une intent derrière (enfin si c’est comme ca que cela marche).
Dans ton post de code ici : http://android-france.fr/2009/11/26/developpez-votre-propre-reveil-alarme-avec-votre-android-phone/ tu as le code suivant :
public class AlarmReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
try {
Toast.makeText(context, « C’est l’heure !!! »,Toast.LENGTH_LONG).show();
//On peut mettre ce que l’on veut. Vibreur, lecture d’un mp3 ou autre.
}
}
}
Et tu as indiqué de faire comme cela au début des commentaires de ce post :
Intent intentToLaunch = new Intent();
intentToLaunch.setClass(context, AlarmReceiverDisplay.class);
intentToLaunch.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intentToLaunch);
Donc je ne vois pas trop comment faire, si vous pouviez m’aiguiller ?
Mon erreur était qu’il faut lancer le broadcast receiver comme ceci :
Intent intent = new Intent(this, ReceiveSMS.class);
PendingIntent.getBroadcast(this, 10, intent, 0);
Et non le lancer comme une simple activity !