Android 记录一个使用AlarmManager的坑。

本文详细解析了在Android中使用PendingIntent进行定时广播时遇到的问题,特别是当连续设置多个相近时间的广播时,如何避免系统仅按第一次设置的PendingIntent发送广播。介绍了requestCode和flag参数的作用,以及如何通过它们来区分不同的PendingIntent。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正常使用的代码是这样的:

private void createAlarm(String message, int hour, int minutes){
	AlarmManager alarmManager = (AlarmManager)
	getSystemService(Service.ALARM_SERVICE);
	//设置定时发送广播的PendingIntent
	Intent intent = new Intent(this, ClockReceiver.class);
	Bundle bundle = new Bundle();
	bundle.putString("text",message);
	intent.putExtras(bundle);
	PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);
	//设置当前时间
	Calendar c = Calendar.getInstance();
	c.setTimeInMillis(System.currentTimeMillis());
	// 根据用户选择的时间来设置Calendar对象
	c.set(Calendar.HOUR_OF_DAY, hour);
	c.set(Calendar.MINUTE, minutes);
	c.set(Calendar.SECOND,0);
	c.set(Calendar.MILLISECOND, 0);
	// 设置AlarmManager在Calendar对应的时间发送广播
	alarmManager.cancel(pi);
	alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);
}

这样使用是没毛病的。

但是问题在于,你 接连 定时两个广播发送的话。就是两个广播的发送时间间距较短。问题就出现。

尽管你给定时器设置了新的 PendingIntent ,然而它只会以你 第一次 设置的 PendingIntent 来发送广播。

  • 拿我上面的代码做例子。
    我两次传入不同的 message 来调用 createAlarm()。如果设置的两次定时的时间间隔较短。那么我的广播会两次拿到第一个 message

解决方法

在于这一行代码

PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);

需要注意这里的 PendingIntent.getBroadcast() 第二个参数requestCode,和第四个参数 flag。

  • 可以通过传参不同的 requestCode 使系统识别这是两个不同 PendingIntent
  • 也可以通过修改flag为 FLAG_CANCEL_CURRENT 。flag常用值:

FLAG_ONE_SHOT:获取的PendingIntent只能使用一次。
FLAG_CANCEL_CURRENT:如果描述的PendingIntent已经存在,那么新的Intent之前会取代掉当前的。
FLAG_UPDATE_CURRENT:能够新new一个 Intent

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值