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

Android通知操作-意图额外未按预期工作,android,android-intent,android-notifications,Android,Android Intent,Android Notifications,我正在创建一个带有多个操作的通知。我正在使用广播意图传达一个人已经被推了出去,并采取了具体的行动。有4个按钮,我已经创建了4个单独的意图。每一个都有相同的操作字符串,但不同的StringExtra Intent intNow = new Intent(mThis, MyReceiver.class).setAction(actionNotify).putExtra("button", ACT_NOW); Intent intEmail = new Intent(mThis, MyRece

我正在创建一个带有多个操作的
通知
。我正在使用
广播意图
传达一个人已经被推了出去,并采取了具体的行动。有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);
因此,通知已成功创建。按钮在那儿。但无论我推哪一个,传递给
接收器的额外动作始终是定义的最后一个动作。也就是说,在上面的示例中,每个按钮都会返回一个额外的字符串,该字符串等于
ACT\u NEVER
。如果我对
.addAction
重新排序,使intLater是最后一个,那么无论我按下哪个按钮,接收者都会告诉我字符串Extra等于
ACT\u LATER


我不明白为什么——这4个
意图是完全独立的。这些操作指定了正确的
意图。发生什么事?我被难住了。

我已经阅读了关于
addAction()
的文档,其中有非常有趣的内容:

  • 扩展形式的通知最多可显示3个动作
  • 每个动作必须有一个图标
您使用0作为图标和4个操作,这可能会对行为产生一些影响


  • 您应该将图标设置为第一个参数,而不是0
  • 您当前的结果,因为您使用相同的操作和相同的请求代码来构造PendingEvent,所以4个PendingEvent将是相同的,并且您使用
    PendingEvent.FLAG_UPDATE_current
    ,所以最后一个PendingEvent的额外值将替换之前的一个
  • 因此,要解决您的问题,您只需为四个
    PendingContent
    设置不同的
    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))
    

    就这样!使用不同的RequestCode就可以做到这一点。不知何故,我觉得RequestCode没有被利用,因为没有一种方法可以从被调用的类访问它。谢谢@Scott,很高兴能帮助您,我之前也遇到过同样的错误。“您应该将图标设置为第一个参数,而不是0。”为什么,如果我不需要任何图标呢?上面的答案(RequestCode)似乎已经解决了这个问题。但你提到的最多3个动作是我完全没有注意到的,需要修正。谢谢