通知意向不变

时间:2019-02-14 21:36:25

标签: android notifications android-pendingintent

我有一个警报接收器,它会进行一些检查,然后为每个检查创建一个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);
}

我遇到的问题是,即使我创建了一个不同的意图,它仍然始终使用相同的附加项(apikey和installid)来调用Activity。它总是需要创建的第一个。

3 个答案:

答案 0 :(得分:3)

问题似乎是由您传递给getActivity方法的参数引起的。

尝试以下代码

PendingIntent.getActivity(context, <unique_value_per_every_call>, intent, 0);

第二个参数是requestCode,因此它应该是唯一的。

答案 1 :(得分:1)

公认的答案是解决问题的一种方法,但这不是唯一的方法。

要在每次通话中获得唯一的PendingIntent,对PendingIntent.getActivity()的呼叫需要提供 唯一的requestCode 唯一的Intent。要使Intent唯一,必须提供 唯一的ACTION,DATA或COMPONENT。因此,有几种方法可以解决此问题。

答案 2 :(得分: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