两个按钮,一个 Activity

Two buttons, one Activity

我的通知中有两个按钮,它们打开相同的 activity 但作为额外的不同数据发送。我真的需要创建 2 个待定意图和 2 个意图吗?也许有这个的一些缩短版本?

        Intent intent1 = new Intent(this, ResponseActivity.class); //same
        intent1.putExtra("RES","a");
        intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP   | Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pendingIntent1 = PendingIntent.getActivity(this, 1, intent1, PendingIntent.FLAG_UPDATE_CURRENT);

        Intent intent2 = new Intent(this, ResponseActivity.class); //same
        intent2.putExtra("RES","b"); //but different
        intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP   | Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pendingIntent2 = PendingIntent.getActivity(this, 1, intent2, PendingIntent.FLAG_UPDATE_CURRENT);


        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
                .setSmallIcon(R.drawable.ic_launcher_background)
                .addAction(0, "A", pendingIntent1) 
                .addAction(0, "B", pendingIntent2) 
                .setLargeIcon(bitmap)
                .setContentTitle(userDB.getName())
                .setContentText(smallText)
                .setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_ALL)
                .setColor(getResources().getColor(R.color.colorPrimary))
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);

Intent 不是打开 activity 的调用,但实际上更多的是发送给 activity 的消息(在大多数情况下是启动 activity).

所以不幸的是,如果你想要两条不同的消息,你需要两个不同的意图。

考虑到 putEtra() returns Intent 你可以像这样缩短你的代码:

public static PendingIntent getPendingIntent(Intent intent) {
  return PendingIntent.getActivity(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

Intent intent = new Intent(this, ResponseActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

.addAction(0, "A", getPendingIntent(intent.putExtra("RES","a"))) 
.addAction(0, "B", getPendingIntent(intent.putExtra("RES","b")))

您的代码有问题。您的代码最终将在两个按钮上设置相同的 PendingIntent 和相同的 Intent。这是因为在比较 Intent 以确定给定 Intent 是否已经存在 PendingIntent 时,不考虑 "extras"。在您的情况下,2 个 Intent 看起来相同,因此对 PendingIntent.getActivity() 的 2 个调用将 return 相同 PendingIntent.

您需要将代码更改为如下所示:

    Intent intent = new Intent(this, ResponseActivity.class); //same
    intent.putExtra("RES","a");
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent pendingIntent1 = PendingIntent.getActivity(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    // Update the "extra" in the Intent
    intent.putExtra("RES","b"); //but different
    PendingIntent pendingIntent2 = PendingIntent.getActivity(this, 2, intent, PendingIntent.FLAG_UPDATE_CURRENT);

我用一个 Intent 产生了 2 个不同的 PendingIntent。这里的关键是为 requestCode(这是 PendingIntent.getActivity() 的第二个参数)使用不同的值。这确保您得到 2 个不同的 PendingIntents.