从通知操作按钮接收额外信息
Receive extra from a notification action button
我的应用程序在未来的特定日期推送通知。
在通知中您将有两个选项:
- 点击通知正文 --> 正常打开应用程序
- 点击通知中的操作按钮 --> 打开应用程序并执行操作
为此,我想在启动应用程序时可以读取的意图中添加一个额外的内容。因此,我将通知接收器设置如下:
public class NotificationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent contentIntent = new Intent(context, MainActivity.class);
PendingIntent contentPendingIntent = PendingIntent.getActivity(context, App.REMINDERS_ID, contentIntent, PendingIntent.FLAG_MUTABLE);
Intent extendIntent = new Intent(context, MainActivity.class);
extendIntent.putExtra(App.BUNDLE_ACTION, App.ACTION_EXTEND_WEAR);
PendingIntent extendPendingIntent = PendingIntent.getActivity(context, App.REMINDERS_ID, extendIntent, PendingIntent.FLAG_MUTABLE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_REMINDERS_ID)
.setSmallIcon(R.drawable.ic_baseline_calendar_today_24)
.setContentTitle(intent.getStringExtra("title"))
.setContentText(intent.getStringExtra("text"))
.setContentIntent(contentPendingIntent)
.addAction(0,intent.getStringExtra("action_extend"), extendPendingIntent)
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
// .addAction(0,intent.getStringExtra("action_stop"), contentIntent)
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
int id = intent.getIntExtra("id", 1);
notificationManager.notify(id, builder.build());
}
不,当应用程序启动时,我想检查意图是否有额外的(BUNDLE_ACTION)。
Bundle bundle = this.getActivity().getIntent().getExtras();
if (bundle != null && bundle.containsKey(App.BUNDLE_ACTION)) {
// Perform the action on app start
Log.e(App.TAG, "Action received from notification! Action = " + bundle.getInt(App.BUNDLE_ACTION));
} else {
Log.e(App.TAG, "No action received from notification.");
}
接收到额外内容,相应地显示日志条目。
但是,无论我按下通知正文还是通知操作按钮,都会收到额外的内容。
任何人都可以告诉我我做错了什么吗?
谢谢!
您正试图创建两个不同的 PendingIntent
,但您的代码实际上只创建了一个 PendingIntent.
第一次调用创建了一个新的 PendingIntent
:
Intent contentIntent = new Intent(context, MainActivity.class);
PendingIntent contentPendingIntent = PendingIntent.getActivity(context, App.REMINDERS_ID, contentIntent, PendingIntent.FLAG_MUTABLE);
第二次调用 不会创建 一个新的 PendingIntent
。相反,因为 contentIntent
的内容匹配 extendIntent
的内容,所以对 PendingIntent.getActivity()
的调用实际上 returns PendingIntent
先前在第一次调用中创建:
Intent extendIntent = new Intent(context, MainActivity.class);
extendIntent.putExtra(App.BUNDLE_ACTION, App.ACTION_EXTEND_WEAR);
PendingIntent extendPendingIntent = PendingIntent.getActivity(context, App.REMINDERS_ID, extendIntent, PendingIntent.FLAG_MUTABLE);
这是因为在比较两个Intent
时,忽略了Intent
中的“extras”。
要解决此问题,您需要确保 PendingIntent
是唯一的。有很多方法可以做到这一点,这里有一些:
- 为每个
Intent
添加一个 ACTION 并确保它们不同
- 在对
PendingIntent.getActivity()
的每次调用中使用不同的 requestCode
(而不是对两个 使用 App.REMINDERS_ID
我的应用程序在未来的特定日期推送通知。 在通知中您将有两个选项:
- 点击通知正文 --> 正常打开应用程序
- 点击通知中的操作按钮 --> 打开应用程序并执行操作
为此,我想在启动应用程序时可以读取的意图中添加一个额外的内容。因此,我将通知接收器设置如下:
public class NotificationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent contentIntent = new Intent(context, MainActivity.class);
PendingIntent contentPendingIntent = PendingIntent.getActivity(context, App.REMINDERS_ID, contentIntent, PendingIntent.FLAG_MUTABLE);
Intent extendIntent = new Intent(context, MainActivity.class);
extendIntent.putExtra(App.BUNDLE_ACTION, App.ACTION_EXTEND_WEAR);
PendingIntent extendPendingIntent = PendingIntent.getActivity(context, App.REMINDERS_ID, extendIntent, PendingIntent.FLAG_MUTABLE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_REMINDERS_ID)
.setSmallIcon(R.drawable.ic_baseline_calendar_today_24)
.setContentTitle(intent.getStringExtra("title"))
.setContentText(intent.getStringExtra("text"))
.setContentIntent(contentPendingIntent)
.addAction(0,intent.getStringExtra("action_extend"), extendPendingIntent)
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
// .addAction(0,intent.getStringExtra("action_stop"), contentIntent)
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
int id = intent.getIntExtra("id", 1);
notificationManager.notify(id, builder.build());
}
不,当应用程序启动时,我想检查意图是否有额外的(BUNDLE_ACTION)。
Bundle bundle = this.getActivity().getIntent().getExtras();
if (bundle != null && bundle.containsKey(App.BUNDLE_ACTION)) {
// Perform the action on app start
Log.e(App.TAG, "Action received from notification! Action = " + bundle.getInt(App.BUNDLE_ACTION));
} else {
Log.e(App.TAG, "No action received from notification.");
}
接收到额外内容,相应地显示日志条目。 但是,无论我按下通知正文还是通知操作按钮,都会收到额外的内容。
任何人都可以告诉我我做错了什么吗?
谢谢!
您正试图创建两个不同的 PendingIntent
,但您的代码实际上只创建了一个 PendingIntent.
第一次调用创建了一个新的 PendingIntent
:
Intent contentIntent = new Intent(context, MainActivity.class);
PendingIntent contentPendingIntent = PendingIntent.getActivity(context, App.REMINDERS_ID, contentIntent, PendingIntent.FLAG_MUTABLE);
第二次调用 不会创建 一个新的 PendingIntent
。相反,因为 contentIntent
的内容匹配 extendIntent
的内容,所以对 PendingIntent.getActivity()
的调用实际上 returns PendingIntent
先前在第一次调用中创建:
Intent extendIntent = new Intent(context, MainActivity.class);
extendIntent.putExtra(App.BUNDLE_ACTION, App.ACTION_EXTEND_WEAR);
PendingIntent extendPendingIntent = PendingIntent.getActivity(context, App.REMINDERS_ID, extendIntent, PendingIntent.FLAG_MUTABLE);
这是因为在比较两个Intent
时,忽略了Intent
中的“extras”。
要解决此问题,您需要确保 PendingIntent
是唯一的。有很多方法可以做到这一点,这里有一些:
- 为每个
Intent
添加一个 ACTION 并确保它们不同 - 在对
PendingIntent.getActivity()
的每次调用中使用不同的requestCode
(而不是对两个 使用
App.REMINDERS_ID