0

在我的活动中,我正在管理用户提供的食物列表,并根据它们的到期时间设置警报。然而由于某种原因,传递给 onRecieve 的意图并不是我认为应该的。

例如,用户输入有效期为 5/8 的浆果和有效期为 6/4 的黄油,然后点击保存数据。对于每个项目,都会调用此方法。每次调用此方法时,我都会使用 putExtra 保存到期日期。

    public void setOneTimeAlarm(int daysAfterSet) {
    //declare intent using class that will handle alarm
    Intent intent = new Intent(this, FoodExpAlarm.class);
    //retrieve pending intent for broadcast, flag one shot means will only set once
    intent.putExtra("expDate", expDate);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
      intent, PendingIntent.FLAG_ONE_SHOT);
    //params: specify to use system clock use RTC_WAKEUP to wakeup phone for notification,
    //time to wait, intent
    alarmMan.set(AlarmManager.RTC_WAKEUP,
      System.currentTimeMillis() + (daysAfterSet * AlarmManager.INTERVAL_DAY), pendingIntent);
 }

这会导致为浆果设置一个警报,因为它们即将到期,而黄油没有警报(距离到期还有一个月)。然后调用一次 foodExpAlarm 类,并正确显示有关浆果的通知。然而,问题来自于下一批食物的输入时间。接下来,用户输入 5/8 到期的培根和 5/15 到期的香蕉。现在 setOneTimeAlarm 再次调用两次(每次调用一次),而 foodExpAlarm 再次调用培根一次。

但是,在 foodExpAlarm 中,传入的额外内容来自黄油而不是培根。这对我来说毫无意义,因为应该在时间过去后调用 foodExpAlarm,并且应该使用与预定时间相对应的待处理意图来调用。然而,情况似乎并非如此,似乎意图(或至少是额外的)只对应于添加所有食物的顺序。

执行总结:

  • 添加浆果 5/8
  • 加入黄油 6/4
  • 节省
  • 正确显示浆果通知
  • 加培根 5/8
  • 加香蕉 5/15
  • 节省
  • 黄油显示不正确

我的问题是,为什么我会得到黄油而不是培根的意图/额外内容?我对意图的理解是错误的吗?我怎样才能解决这个问题?

foodExpAlarm:

    public void onReceive(Context context, Intent intent) {

    Bundle exp = intent.getExtras(); //This gets the extras from butter, not bacon like I want
    Object temp = exp.get("expDate");  
    Enter_Foods.expDate = new DateTime(temp);
    intent.getExtras();
    int id = (int) (Enter_Foods.expDate).getMillis();
    ....

    notificationMan = (NotificationManager) context
            .getSystemService(Context.NOTIFICATION_SERVICE);
    //i think this gets pending intent from the alarm that called this method
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
        new Intent(context,MainActivity.class), Intent.FLAG_ACTIVITY_NEW_TASK);
    //creates notification object/icon, and set text to flow across top bar
    Notification notif = new Notification(R.drawable.ic_launcher,
        "Food expiring soon", System.currentTimeMillis());
    //specify what to display when notification is shown
    notif.setLatestEventInfo(context, from, message, contentIntent);
    //use nofication manager to send message to phone, will update if same id
    notificationMan.notify(id, notif);
    }
4

1 回答 1

0

我认为由于警报管理器和意图的问题,您会遇到冲突。相对于警报管理器使用的意图比较方法,您的意图似乎是相同的意图,因为它们仅在“附加项”方面有所不同,因此您的警报正在互相残杀。

这是该方法的文档中的引用AlarmManager.set

安排闹钟。注意:对于计时操作(滴答声、超时等),使用 Handler 更容易且效率更高。如果已经为同一个 IntentSender 安排了警报,它将首先被取消。

如果时间发生在过去,将立即触发警报。如果这个 Intent 调度已经有一个警报(两个 Intent 的相等性由 filterEquals(Intent) 定义),那么它将被删除并替换为这个。

然后在filterEquals(Intent) 文档中:

出于意图解析(过滤)的目的,确定两个意图是否相同。也就是说,如果它们的动作、数据、类型、类和类别相同。这不会比较意图中包含的任何额外数据。

于 2013-05-06T03:49:17.450 回答