android - Android 中同时发出多个警报

标签 android android-alarms

我被困在这个问题上了。我已经阅读了很多关于堆栈溢出的解决方案,但没有一个解决了我的问题。

这是我的代码: 在我的主要 Activity 中,我写了这个——

    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);
            }

所以第一次打开应用程序时,会调用广播接收器,即 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 Activity 中的服务触发一个 Intent 。请注意,在调用 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 将导致BroadcastReceiver 以15000 毫秒为间隔多次触发。请改用 setExact

关于android - Android 中同时发出多个警报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35402229/

相关文章:

java - fragment 兼容性问题:

android:永远每小时安排一次工作

android - 在android中每周重复一次闹钟

android - 使用广播接收器在 Android 中启动 AlarmManager?

android - 手机重启后如何记住未决的 Intent 和警报?

android - Google Nexus 4 未调用警报管理器

android - 将 XML 布局转换为位图图像时, ListView 项目未显示

java - Android HttpClient 发布文件 MultipartEntity

android - Youtube V3 API : know if the video is avaliable on Android mobile device

android - 不是从 Activity 子类获取屏幕尺寸