0

我正在创建一个待办事项应用程序,用户可以在其中创建要记住要做的事情的列表。在创建列表中的每个实例时,我设置了一个警报,在达到条目截止日期时响起。警报接收器会创建一个通知,向用户显示截止日期已到。

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

我设置闹钟的代码如下:

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 变量不断获取旧值。

4

1 回答 1

0

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

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

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

下次打电话时:

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

Android 在它的PendingIntents 列表中查看是否有一个与这个匹配。由于Intent对象的比较不包括 extras,因此它会找到前一个onClickIntent并返回与第一次完全相同的标记。您将令牌传递给Notification,当Notification启动 时Activity,它会获得第一组额外内容。

要解决此问题,您需要确保每次调用都PendingIntent.getActivity()返回一个唯一的令牌onClickIntent,并且 Android 正在使用正确的附加项保存每个单独的实例。为此,您只需将第二个参数设置为唯一值,例如:

int uniqueValue = (int)currentTimeMillis();
PendingIntent pIntent = PendingIntent.getActivity(context, uniqueValue, onClickIntent, 0);
于 2013-05-14T16:09:17.677 回答