Как установить несколько будильников с помощью диспетчера тревог в Android - PullRequest
52 голосов
/ 12 декабря 2011

Я создаю приложение для будильника. Я успешно реализовал основные функции сигнализации.

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);

В моем приложении пользователь может выбрать дни (sunday,monday...), чтобы повторять будильник еженедельно. Я пытаюсь создать несколько будильников, чтобы повторять их еженедельно, но не знаю, как это сделать. Могу ли я создать его, используя (повторить) интервал, или я должен создать несколько менеджеров тревог?

Ответы [ 5 ]

144 голосов
/ 10 апреля 2012

Вам нужно использовать different Broadcast id's для pending intents. Что-то вроде это:

    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);

Использование системного времени должно быть уникальным идентификатором для каждого ожидания намеревайся уволить

10 голосов
/ 12 декабря 2011

С документы :

Если для этого намерения уже запланирован сигнал тревоги (с равенством двух намерений, определяемым filterEquals (Intent) , затем он будет удален и заменен этим

Несколько AlarmManagers не решит вашу проблему. Если у них несколько разных аварийных сигналов (разное время и разные дни), то вам потребуетсядля установки будильника в BroadcastReceiver каждый раз при срабатывании предыдущего будильника.

Вам также необходимо удерживать RECEIVE_BOOT_COMPLETED и иметь BroadcastReceiver для получения загрузки, такчто если телефон перезагружается, вы можете перепланировать свои тревоги.

6 голосов
/ 21 ноября 2012

Чтобы установить несколько будильников, вам нужно каждый раз определять Intent, чтобы он отличался от других. Самый простой способ сделать это - установить поле data вашего Intent следующим образом:

// 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));
...

Остальная часть вашего кода @ Hassy31 в порядке как есть и остается без изменений.

Обратите внимание, что параметр requestCode в методе PendingIntent.getBroadcast() (как предложено @parag) не используется в соответствии с документацией, поэтому это неправильный способ.

2 голосов
/ 11 сентября 2015

установить широковещательную рассылку id для 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);
}
1 голос
/ 06 января 2019

Установка нескольких будильников с помощью диспетчера тревог 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())
    }
}
...