这很好用:
Intent intent = new Intent(HelloAndroid2.this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(HelloAndroid2.this, 0,
intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (12 * 1000), pendingIntent);
这不起作用。我只听到闹钟的声音。
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (12 * 1000), 3 * 1000, pendingIntent);
我也试过这个,没有运气:
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 5);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 7000, pendingIntent);
有什么问题?
答案 0 :(得分:4)
来自FLAG_ONE_SHOT的PendingIntent doc:
这个PendingIntent可以 只能使用一次。如果设置,之后 调用send()就可以了 为您和任何人自动取消 将来尝试通过它发送 失败。
所以在pendingIntent第一次被触发后,它将被取消,下一次通过警报管理器发送它的尝试将失败
尝试使用FLAG_UPDATE_CURRENT
答案 1 :(得分:0)
按顺序查看代码示例:
在您的第一个示例中,您正在使用AlarmManager.set - 这仅限于一次性警报,所以是的,它只会触发一次。如果你想使用AlarmManager.set,那么代码触发的最后一件事就是设置一个新的警报(它也应该使用一个新的PendingIntent)。
在您的第二个示例中,您正在使用重复警报。每次激活时,不需要创建一个新的PendingIntent,因为操作系统会处理警报的重复方面。
没有理由说你的闹钟不应该每3秒重复一次,所以我会开始查看你为处理闹钟而编写的BroadcastReceiver实现。
检查您是否已正确实施。注释掉onReceive()方法中的所有代码,而只是让它编写一条日志消息。每当警报触发时,您都会看到日志消息出现在logcat中,请将代码重新添加(保留日志消息),并将另一条日志消息添加到方法的末尾。这允许您查看该方法执行所需的时间 - 您希望在警报再次触发之前完成该操作以避免任何意外的副作用。
顺便说一下,如果你想要一个重复的警报,android.os.Handler是一种更有效的方法,虽然通过AlarmManager设置的警报可以非常准确地触发。