问题
I'm stuck on this problem. I've read many solutions on stack overflow but none of these have solved my problem.
Here's my code: In my Main Activity, I wrote this--
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);
}
So the first time the app is opened a Broadcast Receiver is called which is the AlarmManager.java. Here's what I did in my Alarm Manager: In my 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);
}
}
}
}
And here's the createPendingIntent method I separately made:
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);
}
So everytime the current time matches the time from the database an intent is fired through a service which is in my AlarmManager activity. Notice that in calling the getService, the request code is the unique id from database. My problem is eventhough I am using a unique id, everytime there is 2 or more alarm to be fired at the same time only one of those is sucessfully fired. So how should I do this?
回答1:
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);
}
Calling setRepeating
will cause the BroadcastReceiver
to be triggered multiple times at an interval of 15000 milliseconds. Use setExact
instead.
来源:https://stackoverflow.com/questions/35402229/multiple-alarms-at-the-same-time-in-android