在android上创建多个警报时遇到一些问题

时间:2013-05-14 15:27:53

标签: android android-intent android-broadcast android-pendingintent

我正在创建一个todo应用程序,用户可以在其中创建要记住的事项列表。在列表中创建每个实例时,我会设置一个警报,以便在达到截止日期时关闭。警报接收器会创建一个通知,向用户显示截止日期已到达。

我遇到的问题是我在通知意图中传递的额外字符串没有正确更新。第一个警报功能很好,但是我在第一个警报之后创建的每个条目都获得与第一个相同的额外字符串。

我设置闹钟的代码如下:

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

Intent intent = new Intent(context, DeadlineActivator.class);
intent.setAction("todo" + System.currentTimeMillis());
intent.putExtra("todoname", name);

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 
        (int)System.currentTimeMillis(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, deadline.getTime(), pendingIntent);

不知道它是否有用,但条目的名称是唯一的

警报的onRecieve方法如下所示

public void onReceive(Context context, Intent intent)
{
    String todoName = intent.getStringExtra(ToDoItem.TODONAME);

    NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);

    Intent onClickIntent = new Intent(context, WatchToDo.class);
    onClickIntent.putExtra(Auth.TARGET_TODO, todoName);
    PendingIntent pIntent = PendingIntent.getActivity(context, 0, onClickIntent, 0);
    String body = "Deadline of " + todoName + " has been reached";
    String title = "Deadline reached";
    Notification n = new Notification.Builder(context)
     .setContentTitle(title)
     .setContentText(body)
     .setSmallIcon(R.drawable.ic_launcher)
     .setContentIntent(pIntent)
     .setAutoCancel(true)
     .build();
    nm.notify(NOTIFICATION_ID, n);
}

调试时,我看到在创建警报意图时使用的名称var具有正确的值。然而,onRecieve中的todoName var会保持旧值。

1 个答案:

答案 0 :(得分:0)

这是一个常见问题。您需要真正了解PendingIntent的工作原理。问题是,当你打电话:

PendingIntent pIntent = PendingIntent.getActivity(context, 0, onClickIntent, 0);

Android会返回一个“令牌”,可用于启动onClickIntent。 Android将此Intent存储在内部管理列表中,并将令牌分配给它。

下次打电话时:

PendingIntent pIntent = PendingIntent.getActivity(context, 0, onClickIntent, 0);

Android在其PendingIntent列表中查看是否有匹配此列表的Intent。由于onClickIntent对象的比较不包含附加内容,因此它会找到之前的Notification并返回与第一次完全相同的令牌。您将令牌传递给Notification,当Activity启动PendingIntent.getActivity()时,它会获得第一组附加内容。

要解决此问题,您需要确保每次调用onClickIntent都会返回唯一令牌,并且Android会使用正确的额外内容保存int uniqueValue = (int)currentTimeMillis(); PendingIntent pIntent = PendingIntent.getActivity(context, uniqueValue, onClickIntent, 0); 的每个单独实例。为此,您只需将第二个参数设置为唯一值,例如:

{{1}}