我被困在这个问题上.我已经阅读了许多关于堆栈溢出的解决方案,但是没有一个解决了我的问题.
这是我的代码:
在我的主要活动中,我写道:
this.context = this;
Intent alarm = new Intent(this.context, AlarmManager.class);
boolean alarmRun = (PendingIntent.getBroadcast(this.context,0,alarm, PendingIntent.FLAG_NO_CREATE) != null);
if (alarmRun == false){
PendingIntent pending = PendingIntent.getBroadcast(this.context, 0, alarm, 0);
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 15000, pending);
}
因此,第一次打开该应用程序时,将调用Broadcast Receiver,即AlarmManager.java.
这是我在“警报管理器”中所做的操作:
在我的onReceive中-
AlarmDB db = new AlarmDB (context);
List<Alarm> alarms = db.getAlarm();
if(alarms != null)
{
for (Alarm alarm : alarms)
{
Calendar calendar = Calendar.getInstance();
final int nowHour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
final int nowMinute = Calendar.getInstance().get(Calendar.MINUTE);
final int nowDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(alarm.getAlarmHour()));
calendar.set(Calendar.MINUTE, Integer.parseInt(alarm.getStartTimeMinute()));
calendar.set(Calendar.SECOND, 00);
PendingIntent pIntent = createPendingIntent(context, alarm);
if (!(Integer.parseInt(alarm.getAlarmHour()) < nowHour) && !(Integer.parseInt(alarm.getAlarmHour()) == nowHour && Integer.parseInt(alarm.getStartTimeMinute()) <= nowMinute))
{
AlarmManager alarmMgr = (AlarmManager)c.getSystemService(Context.ALARM_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)
{
alarmMgr.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
} else {
alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
}
}
}
}
这是我单独制作的createPendingIntent方法:
private static PendingIntent createPendingIntent(Context context, Alarm m) {
Intent i = new Intent(context, AlarmService.class);
i.putExtra(ID, m.getID());
i.putExtra(NAME, m.getMedName());
return PendingIntent.getService(context, m.getID(), i, PendingIntent.FLAG_UPDATE_CURRENT);
}
因此,每当当前时间与数据库中的时间匹配时,就会通过AlarmManager活动中的服务触发意图.请注意,在调用getService时,请求代码是数据库中的唯一ID.我的问题是,尽管我使用的是唯一的ID,但每次同时触发2个或更多警报时,只有其中一个成功触发.那我该怎么做呢?
解决方法:
if (alarmRun == false){
PendingIntent pending = PendingIntent.getBroadcast(this.context, 0, alarm, 0);
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 15000, pending);
}
调用setRepeating将导致以15000毫秒的间隔多次触发BroadcastReceiver.请改用setExact.
标签:android,android-alarms 来源: https://codeday.me/bug/20191013/1910525.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。