Android 记录一个使用AlarmManager的坑。

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

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() 第二个参数,必须不同。定时器才会设置两个不同 PendingIntent

上一篇:Android护眼功能


下一篇:Android第三方开源水面波浪波形view:WaveView(电量、能量、容量指示)