通知中的意图不会改变

6

我有一个告警接收器,它做一些检查,然后为每个检查创建一个 Notification。这意味着它可以创建多个 Notification。这一切都很好地运作。然而,我有一个与通知相关联的 Intent,当通知被点击时启动一个活动。

这是通知代码:

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, CHANNEL_OUTPUT_LEVELS)
                .setSmallIcon(icon)
                .setContentTitle(title)
                .setContentText(message)
                .setStyle(new NotificationCompat.BigTextStyle()
                        .bigText(longmessage))
                .setContentIntent(getPendingIntent(solarEdge, reason))
                .setAutoCancel(true)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);

NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);

// notificationId is a unique int for each notification that you must define
// we use the installation's ID to make sure all notifications get sent
notificationManager.notify(solarEdge.getInfo().getId(), mBuilder.build());

创建 PendingIntent 的方法是:
private PendingIntent getPendingIntent(SolarEdge solarEdge, int reason) {
    String apikey = solarEdge.getApikey();
    int installationId = solarEdge.getInfo().getId();

    Intent intent = new Intent(context, InstallationActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    intent.putExtra(EXTRA_API_KEY, apikey);
    intent.putExtra(EXTRA_INSTALLATION_ID, installationId);
    intent.putExtra(EXTRA_REASON, reason);

    return PendingIntent.getActivity(context, 0, intent, 0);
}

我遇到的问题是,即使我创建了不同的意图(intent),它仍然总是调用具有相同额外信息(apikey和installid)的Activity。它总是选择第一个被创建的。
3个回答

17

看起来问题是由于您传递给getActivity方法的参数引起的。

尝试以下代码

PendingIntent.getActivity(context, <unique_value_per_every_call>, intent, 0);
第二个参数是 requestCode,因此它应该是唯一的。

@BartFriederichs 不用谢,有时文档并不包含重要信息。 - CROSP
1
@BartFriederichs 这是一个请求代码,意味着它应该对于该请求是唯一的,但我也犯了这个错误。 - TheWanderer
1
为了在每次调用时获得唯一的PendingIntent,需要调用PendingIntent.getActivity()并提供要么独特的requestCode 要么独特的Intent。要使Intent唯一,必须提供要么独特的ACTION、DATA或COMPONENT。因此,有几种方法可以解决这个问题。 - David Wasser

2
最初的回答只是一种解决问题的方法,但并不是唯一的方法。为了在每次调用时获得唯一的 PendingIntent,调用 PendingIntent.getActivity() 需要提供一个唯一的 requestCode 或者一个唯一的 Intent。为了使 Intent 唯一,需要提供一个唯一的 ACTION、DATA 或 COMPONENT。因此,有几种方法可以解决这个问题。

0

已知的“问题”/怪异/设计,我们程序员不断遇到它。 如果意图相同(操作、数据或组件相同,而不仅是额外数据不同),则请求代码参数必须是0以外的其他值。

int requestCode = 1;
PendingIntent.getActivity(context, requestCode, intent, 0);

另外:

如果您想稍后更新通知/挂起意图,可以使用相同的requestCode。

如果您添加多个挂起意图,它们必须全部不同。例如:停止和暂停操作。

我通常遵循这种模式:

requestCode = 1 for the content intent.
requestCode = 2 for first action
requestCode = 3 for second action
etc

它实际上必须每次调用都是唯一的。如果我只输入1,它仍然不能正确工作。 - Bart Friederichs
不是每次调用,而是每个你想添加的意图。如果您稍后想要更新它,例如将“播放”意图更改为“暂停”意图,则使用相同的。 - Mattias Isegran Bergander
这是错误的。请求代码不需要为非零值。为了在每次调用时获得唯一的“PendingIntent”,调用PendingIntent.getActivity()需要提供要么一个唯一的requestCode 或者一个唯一的“Intent”。为了使“Intent”唯一,必须提供要么一个唯一的ACTION、DATA或COMPONENT。因此,有几种方法可以解决这个问题,但将requestCode更改为“1”不是其中之一。 - David Wasser
哦,是的,完全同意,你可以按照你说的方式使意图变得独特。 - Mattias Isegran Bergander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接