首页 文章

如何在android中使用报警管理器设置多个报警

提问于
浏览
51

我正在构建一个警报应用程序 . 我已经成功实现了基本的报警功能 .

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...) 每周重复闹钟 . 我'm trying to create multiple alarms to repeat weekly but don't知道该怎么做 . 我可以使用(重复)间隔创建它还是应该创建多个警报管理器?

5 回答

  • 6

    您需要使用 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);
    

    使用系统时间应该是您触发的每个待处理目标的唯一标识符 .

  • 2

    来自the docs

    如果已经安排了此Intent的警报(两个意图的相等性由filterEquals(Intent)定义),那么它将被删除并替换为此

    多个 AlarmManagers 无法解决您的问题 . 如果它们有多个不同的警报(不同的时间和不同的天数),则每次启动上一个警报时都需要在 BroadcastReceiver 内设置警报 .

    您还需要按住RECEIVE_BOOT_COMPLETED并使用 BroadcastReceiver 来接收启动,这样如果手机重新启动,您可以重新安排警报 .

  • 141

    要设置多个警报,您需要每次定义 Intent ,以便与其他警报区分开来 . 我发现这样做最简单的方法是设置 Intentdata 字段,如下所示:

    // 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原样很好并保持不变 .

    请注意,根据文档, PendingIntent.getBroadcast() 方法中的 requestCode 参数(由@parag建议)未使用,因此这不是正确的方法 .

  • 0

    为pendingIntent设置Broadcast id

    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);
    }
    
  • 10

    Set multiple alarms using android alarm manager

    //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())
        }
    }
    

相关问题