从通知操作按钮接收额外信息

Receive extra from a notification action button

我的应用程序在未来的特定日期推送通知。 在通知中您将有两个选项:

  1. 点击通知正文 --> 正常打开应用程序
  2. 点击通知中的操作按钮 --> 打开应用程序并执行操作

为此,我想在启动应用程序时可以读取的意图中添加一个额外的内容。因此,我将通知接收器设置如下:

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