通知中的意图不会改变
Intent in Notification does not change
我有一个警报接收器,它会进行一些检查,然后为每次检查创建一个 Notification
。这意味着它可以创建多个 Notification
。这一切都很好。但是,我有一个 Intent
连接到通知以在点击通知时启动 activity。
这是通知代码:
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
。它总是采用第一个创建的。
问题似乎是由您传递给 getActivity
方法的参数引起的。
试试下面的代码
PendingIntent.getActivity(context, <unique_value_per_every_call>, intent, 0);
第二个参数是 requestCode
,所以它应该是唯一的。
已知 "problem"/quirk/design 而我们程序员将 运行 保存在其中。
如果意图相同(动作、数据或组件相同,不仅仅是额外数据不同),请求代码参数必须不是 0。
int requestCode = 1;
PendingIntent.getActivity(context, requestCode, intent, 0);
此外:
如果您想稍后更新 notification/pending 意图,您可以使用相同的 requestCode。
如果您添加多个待定意向,它们必须各不相同。示例:停止和暂停动作。
我通常遵循以下模式:
requestCode = 1 for the content intent.
requestCode = 2 for first action
requestCode = 3 for second action
etc
接受的答案是解决问题的一种方法,但不是唯一的方法。
要在每次调用时获得唯一的 PendingIntent
,对 PendingIntent.getActivity()
的调用需要提供 或者 唯一的 requestCode
或一个独特的Intent
。要使 Intent
独一无二,必须提供 一个独一无二的 ACTION、DATA 或 COMPONENT。因此有几种方法可以解决这个问题。
我有一个警报接收器,它会进行一些检查,然后为每次检查创建一个 Notification
。这意味着它可以创建多个 Notification
。这一切都很好。但是,我有一个 Intent
连接到通知以在点击通知时启动 activity。
这是通知代码:
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
。它总是采用第一个创建的。
问题似乎是由您传递给 getActivity
方法的参数引起的。
试试下面的代码
PendingIntent.getActivity(context, <unique_value_per_every_call>, intent, 0);
第二个参数是 requestCode
,所以它应该是唯一的。
已知 "problem"/quirk/design 而我们程序员将 运行 保存在其中。 如果意图相同(动作、数据或组件相同,不仅仅是额外数据不同),请求代码参数必须不是 0。
int requestCode = 1;
PendingIntent.getActivity(context, requestCode, intent, 0);
此外:
如果您想稍后更新 notification/pending 意图,您可以使用相同的 requestCode。
如果您添加多个待定意向,它们必须各不相同。示例:停止和暂停动作。
我通常遵循以下模式:
requestCode = 1 for the content intent.
requestCode = 2 for first action
requestCode = 3 for second action
etc
接受的答案是解决问题的一种方法,但不是唯一的方法。
要在每次调用时获得唯一的 PendingIntent
,对 PendingIntent.getActivity()
的调用需要提供 或者 唯一的 requestCode
或一个独特的Intent
。要使 Intent
独一无二,必须提供 一个独一无二的 ACTION、DATA 或 COMPONENT。因此有几种方法可以解决这个问题。