无论时间是否流逝,重新启动时只设置第一个警报(android)

无论时间是否流逝,重新启动时只设置第一个警报(android),android,Android,我刚接触安卓系统,试图通过阅读一些书籍和教程来创建一个事件提醒应用程序。请原谅,如果这是重复的问题,但我在论坛上搜索,无法得到解决我的问题。当设备开启时,警报会被正确触发。但当我的设备在onreceive中重新启动时,它会读取数据库中的所有数据,并通过调用setRemembers()方法设置所有报警,然后无论时间是否已到,它都会触发第一个报警,并且不会显示任何其他报警的通知(尽管第二个和第三个报警必须显示)。我在舱单中添加了权限和接收人。这是我的密码 开机接收机 public class

我刚接触安卓系统,试图通过阅读一些书籍和教程来创建一个事件提醒应用程序。请原谅,如果这是重复的问题,但我在论坛上搜索,无法得到解决我的问题。当设备开启时,警报会被正确触发。但当我的设备在onreceive中重新启动时,它会读取数据库中的所有数据,并通过调用setRemembers()方法设置所有报警,然后无论时间是否已到,它都会触发第一个报警,并且不会显示任何其他报警的通知(尽管第二个和第三个报警必须显示)。我在舱单中添加了权限和接收人。这是我的密码 开机接收机

    public class OnBootReceiver extends BroadcastReceiver
    {
       private static final String TAG = ComponentInfo.class.getCanonicalName();
       @Override
       public void onReceive(Context context, Intent intent)
       {
          ReminderManager reminderMgr = new ReminderManager(context);
          RemindersDbAdapter dbHelper = new RemindersDbAdapter(context);
          dbHelper.open();

          Cursor cursor = dbHelper.fetchAllReminders();
          if(cursor != null)
          {
            cursor.moveToFirst();
            int rowIdColumnIndex = cursor.getColumnIndex(RemindersDbAdapter.KEY_ROWID);
            int dateTimeColumnIndex = cursor.getColumnIndex(RemindersDbAdapter.KEY_DT);

            while(cursor.isAfterLast() == false)
            {
              Log.d(TAG, "Adding alarm from boot.");
              Log.d(TAG, "Row Id Column Index - " + rowIdColumnIndex);
              Log.d(TAG, "Date Time Column Index - " + dateTimeColumnIndex);
              Long rowId = cursor.getLong(rowIdColumnIndex);
              Log.d(TAG, "rowid - " + rowId);
              String dateTime = cursor.getString(dateTimeColumnIndex);
              Calendar cal = Calendar.getInstance();
              SimpleDateFormat format = new SimpleDateFormat(DisplayMessageActivity.DATE_TIME_FORMAT);
              try {
                java.util.Date date = format.parse(dateTime);
                Log.d(TAG, "Date- " + date);
                cal.setTime(date);
                reminderMgr.setReminder(rowId, cal);
                } catch (java.text.ParseException e) {

                Log.e("OnBootReceiver", e.getMessage(), e);

                }
             cursor.moveToNext();
            }
            cursor.close() ;
           } 
         dbHelper.close();
         }
         }
         }
提醒管理器

    public class ReminderManager
    {
      private static final String TAG = ComponentInfo.class.getCanonicalName();
      private Context mContext;
      private AlarmManager mAlarmManager;
      public ReminderManager(Context context)
      {
          mContext = context;
          mAlarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
       }

       public void setReminder(Long taskId, Calendar when)
       {
           Log.d(TAG, "when: "+when);
           Log.d("remindermanage", "rowid: "+taskId);
           Intent i = new Intent(mContext, OnAlarmReceiver.class);
           i.putExtra(RemindersDbAdapter.KEY_ROWID, (long)taskId);
           PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, i, PendingIntent.FLAG_ONE_SHOT);
           mAlarmManager.set(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), pi);
           }
        }

您的代码中存在多个问题:

1) 在广播接收机中使用数据库这不是一个好主意,最好启动一个意向服务并在那里完成工作


2) 您正在循环中调用setReminder,但您正在使用挂起的实例,因为您始终使用0和FLAG_ONE_shot。如果要创建多个挂起的意图,每次都需要创建一个唯一的id并传递给该方法。

非常感谢!!我会努力找出你指出的!!我应该在intent service中创建另一个方法来设置报警,还是应该只向该方法传递唯一id。