web-dev-qa-db-fra.com

comment définir plusieurs alarmes à l'aide du gestionnaire d'alarmes Android

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?

51
Hassy31

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. 

141
Parag Chauhan

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.

10
Reed

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.

6
Adil Hussain

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);
}
2
Huệ Nguyễn

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())
    }
}
0
amir khan