Android通知操作 - 意图额外信息未按预期工作

7
我正在创建一个具有多个操作的 notification。 我正在使用 broadcast intents 来通信,以便在推送其中一个时采取特定操作。 有 4 个按钮,我已经创建了 4 个单独的意图。 每个意图都具有相同的操作字符串,但是不同的 StringExtra
Intent intNow = new Intent(mThis, MyReceiver.class).setAction(actionNotify).putExtra("button", ACT_NOW);
    Intent intEmail = new Intent(mThis, MyReceiver.class).setAction(actionNotify).putExtra("button", ACT_EMAIL);
    Intent intLater = new Intent(mThis, MyReceiver.class).setAction(actionNotify).putExtra("button", ACT_LATER);
    Intent intNever = new Intent(mThis, MyReceiver.class).setAction(actionNotify).putExtra("button", ACT_NEVER);

    Notification.Builder myRatingNotification = new Notification.Builder(mThis)
            .setContentTitle(title)
            .setContentText(text)
            .setSmallIcon(R.mipmap.ic_launcher)
            .addAction(0, mThis.getString(R.string.Rate_Act_Now), PendingIntent.getBroadcast(mThis, 0, intNow, PendingIntent.FLAG_UPDATE_CURRENT))
            .addAction(0, mThis.getString(R.string.Rate_App_Email), PendingIntent.getBroadcast(mThis, 0, intEmail, PendingIntent.FLAG_UPDATE_CURRENT))
            .addAction(0, mThis.getString(R.string.Rate_Act_Later), PendingIntent.getBroadcast(mThis, 0, intLater, PendingIntent.FLAG_UPDATE_CURRENT))
            .addAction(0, mThis.getString(R.string.Rate_Act_Never), PendingIntent.getBroadcast(mThis, 0, intNever, PendingIntent.FLAG_UPDATE_CURRENT))
            .setAutoCancel(true);

    Notification notification = new Notification.BigTextStyle(myRatingNotification).bigText(text).build();
    ((NotificationManager) mThis.getSystemService(Context.NOTIFICATION_SERVICE)).notify(notificationId, notification);

因此,通知已成功创建。按钮都在那里。但是,无论我按哪个按钮,传递给receiver的额外信息始终是最后一个定义的操作。也就是说,在上面的示例中,每个按钮都返回一个等于ACT_NEVER的字符串额外信息。如果我重新排列.addAction,使intLater成为最后一个,接收器会告诉我字符串额外信息等于ACT_LATER,无论我按哪个按钮。
我想不通为什么-这4个Intents完全独立于彼此。动作指定了正确的Intent。发生了什么?我很困惑。
2个回答

20
  1. 你应该将图标作为第一个参数设置,而不是0。
  2. 你目前的结果是因为你使用了相同的操作和相同的requestCode来构建PendingIntent,所以这4个PendingIntent将是相同的,并且你使用了PendingIntent.FLAG_UPDATE_CURRENT,所以最后一个PendingIntent的额外信息将替换之前的。

所以为了解决你的问题,你只需要为四个PendingIntent设置不同的requestCode,像这样:

.addAction(0, mThis.getString(R.string.Rate_Act_Now), PendingIntent.getBroadcast(mThis, 0, intNow, PendingIntent.FLAG_UPDATE_CURRENT))
.addAction(0, mThis.getString(R.string.Rate_App_Email), PendingIntent.getBroadcast(mThis, 1, intEmail, PendingIntent.FLAG_UPDATE_CURRENT))
.addAction(0, mThis.getString(R.string.Rate_Act_Later), PendingIntent.getBroadcast(mThis, 2, intLater, PendingIntent.FLAG_UPDATE_CURRENT))
.addAction(0, mThis.getString(R.string.Rate_Act_Never), PendingIntent.getBroadcast(mThis, 3, intNever, PendingIntent.FLAG_UPDATE_CURRENT))

2
就是这样!使用不同的RequestCode解决了问题。我不知道为什么会认为RequestCode没有被使用,因为从被调用的类中没有访问它的方法。谢谢! - Scott
@Scott,很高兴能帮助你,我之前也遇到了同样的错误。 - starkshang
1
"你应该将图标设置为第一个参数,而不是0。" 为什么?如果我不想要任何图标怎么办? - Glass Cannon

2

我已经阅读了关于addAction()的文档,这里有一些很有趣的内容:

  • 扩展形式的通知最多可以显示3个操作
  • 每个操作必须有一个图标

您使用了0作为图标和4个操作,这可能会对行为产生影响。


上面的答案(RequestCode)似乎解决了问题。但是你提到最多3个操作是我完全忽略了需要修复。谢谢! - Scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接