Je construis une application d'alarme. J'ai implémenté avec succès les fonctions d'alarme de base.
Calendar calendar = Calendar.getInstance();
calendar.set(calendar.HOUR_OF_DAY, sHour);
calendar.set(calendar.MINUTE, sMin);
calendar.set(calendar.SECOND, 0);
calendar.set(calendar.MILLISECOND, 0);
long sdl = calendar.getTimeInMillis();
Intent intent = new Intent(AlarmList.this, AlarmReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(AlarmList.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager ALARM1 = (AlarmManager)getSystemService(ALARM_SERVICE);
ALARM1.set(AlarmManager.RTC_WAKEUP, sdl, sender);
dans mon application, l'utilisateur peut sélectionner des jours (dimanche, lundi ...) pour répéter l'alarme chaque semaine . J'essaie de créer plusieurs alarmes à répéter chaque semaine, mais je ne sais pas comment le faire . Je le crée en utilisant (répétez) intervalle ou devrais-je créer plusieurs gestionnaires d'alarmes?
Vous devez utiliser different Broadcast id's
pour le pending intents
. Quelque chose comme ça:
Intent intent = new Intent(load.this, AlarmReceiver.class);
final int _id = (int) System.currentTimeMillis();
PendingIntent appIntent = PendingIntent.getBroadcast(this, _id, intent,PendingIntent.FLAG_ONE_SHOT);
L’utilisation de l’heure du système doit constituer un identifiant unique pour chaque intention en attente que vous déclenchez.
De les docs :
S'il existe déjà une alarme pour cette intention planifiée (avec L'égalité de deux intentions définie par filterEquals (Intent) , alors Sera supprimée et remplacée par celle-ci.
Plusieurs AlarmManagers
ne résoudraient pas votre problème. S'ils ont plusieurs alarmes différentes (différentes heures et différents jours), vous devrez alors régler l'alarme dans la BroadcastReceiver
à chaque fois que vous déclenchez une alarme précédente.
Vous devez également maintenir RECEIVE_BOOT_COMPLETED
et disposer d'une BroadcastReceiver
pour recevoir le démarrage afin que, si le téléphone est redémarré, vous puissiez reprogrammer vos alarmes.
Pour définir plusieurs alarmes, vous devez définir votre Intent
à chaque fois, afin de la distinguer des autres. Pour ce faire, le moyen le plus simple consiste à définir le champ data
de votre Intent
comme suit:
// give your alarm an id and save it somewhere
// in case you want to cancel it in future
String myAlarmId = ...;
// create your Intent
Intent intent = new Intent(AlarmList.this, AlarmReceiver.class);
intent.setData(Uri.parse("myalarms://" + myAlarmId));
...
Le reste de votre code @ Hassy31 est correct tel quel et reste inchangé.
Notez que le paramètre requestCode
dans la méthode PendingIntent.getBroadcast()
(comme suggéré par @parag) est inutilisé selon la documentation. Ce n'est donc pas la bonne façon de procéder.
définir Broadcast id
pour pendingIntent
for (int id = 0; id < 3; id++) {
// Define pendingintent
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, id,ntent, 0);
// set() schedules an alarm
alarmManager.set(AlarmManager.RTC_WAKEUP, alertTime, pendingIntent);
}
Définir plusieurs alarmes à l'aide du gestionnaire d'alarmes Android
//RC_ARRAY is store all the code that generate when alarm is set
private lateinit var RC_ARRAY:ArrayList<Int>
//tick is just hold the request when new alarm set
private var tick :Int=0
//setAlarm method set alarm
fun setAlarm(c: Calendar, context: Context) {
val manager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
//when alarm store set the request assign to tick variable
tick = System.currentTimeMillis().toInt()
//Add all the alarm Request into RC_ARRAY for just cancel the alarm
RC_ARRAY.add(tick)
//Notification Broadcast intent
val intentAlarm = Intent(context, AlaramFireReceiver::class.Java).let {
PendingIntent.getBroadcast(context, tick, it, PendingIntent.FLAG_ONE_SHOT)
}
//alarm fire next day if this condition is not statisfied
if (c.before(Calendar.getInstance())) {
c.add(Calendar.DATE, 1)
}
//set alarm
manager.setExact(AlarmManager.RTC_WAKEUP, c.timeInMillis, intentAlarm)
}
//remove specific alarm
private fun removeAlarm(context: Context) {
val manager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
//remove specific alarm according to alarm request code
for (i in RC_ARRAY){
val intentAlarm = Intent(context, AlaramFireReceiver::class.Java).let {
PendingIntent.getBroadcast(context, i, it, 0)
}
//cancel alarm
manager.cancel(intentAlarm)
}
}
//delivers notification for alarm
class AlaramFireReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
//Notification ID
val channelid="channelId"
val manger=context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
//check for device only available for Oreo and above
if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.O){
val channel= NotificationChannel(channelid,"alarm notification",NotificationManager.IMPORTANCE_HIGH)
channel.enableLights(true)
manger.createNotificationChannel(channel)
}
//build notification
val build=NotificationCompat.Builder(context,channelid)
.setSmallIcon(R.drawable.ic_access_time_black_24dp)
.setContentTitle("alarm")
.setContentTitle("time done")
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setColor(Color.RED)
//Deliver notification
manger.notify(0,build.build())
}
}