Android 使用PendingEvent传递数据

Android 使用PendingEvent传递数据,android,notifications,android-pendingintent,Android,Notifications,Android Pendingintent,我正试图发出消息已到达的通知。我添加了一个操作,希望在通知中显示一个图标(smallredball)。我预计,如果用户点击smallredball,主活动将启动,检查extras捆绑包的活动将看到执行与正常启动时不同的操作的命令 通知将与文本一起显示在目标手机上(运行KitKat),但小红球图标从不显示。当用户触摸通知时,活动将执行,无需额外操作。编辑:活动现在获得了额外的捆绑包 这是发送通知的代码: private void raiseNotification( String username

我正试图发出消息已到达的通知。我添加了一个操作,希望在通知中显示一个图标(smallredball)。我预计,如果用户点击smallredball,主活动将启动,检查extras捆绑包的活动将看到执行与正常启动时不同的操作的命令

通知将与文本一起显示在目标手机上(运行KitKat),但小红球图标从不显示。当用户触摸通知时,活动将执行,无需额外操作。编辑:活动现在获得了额外的捆绑包

这是发送通知的代码:

private void raiseNotification( String username, String mesText) 
{
    DebugLog.debugLog("GCMIntentService: Attempting to Raise Notification ", false);
    NotificationCompat.Builder b = new NotificationCompat.Builder(this);

    Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra("whattodo", "showmessage");
    intent.setAction(Long.toString(System.currentTimeMillis())); //just to make it unique from the next one
    PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);


    b.setContentTitle("New SafeTalk Message")
    .setSmallIcon(R.drawable.note24x24)
    .setContentText("From " + username + "  " + mesText)
    .setTicker("New SafeTalk Message")
    .setContentIntent(pIntent)
    .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
    .setAutoCancel(true)
    .addAction(R.drawable.smallredball, "Read Now", pIntent);

     NotificationManager mgr = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
     mgr.notify(0, b.build());      
}
这是活动中的代码片段:

        Bundle extras = getIntent().getExtras();
        if (extras == null)
        {
            GlobalStuff.mpBad.start();
        }
        else
        {
            String myOrders =   extras.getString("whattodo");

        if (myOrders.equals("showmessage"))
            GlobalStuff.mpBeep.start();

        }
为什么通知中没有显示图标?因为我将autocancel设置为true,所以我希望只要触摸一下通知就会让它消失。但是,它运行的应用程序没有提供额外的捆绑? 谢谢 院长

这一主题在

由于解决这个问题和我遇到的类似问题的要点在该主题中有点分散,下面是我的两点备忘:

第1点:使用如下代码创建挂起的意图。最后一个参数中标志的选择很重要:

PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
第2点:挂起的意图存储在一个全局系统表中,只有创建意图的某些部分是用于在此表中查找内容的“键”的一部分。Extra不是键的一部分,因此如果您希望两个意图映射到两个不同的挂起意图,请确保它们在其他方面是不同的,例如具有不同的操作、数据或类型

此示例更改操作:

Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("whattodo", "showmessage");
// add this:
intent.setAction("showmessage");
(动作可以是任何东西,只要它不同于您在其他地方对同一类使用的动作。 )

这篇文章中有一个很好的解释,特别是我引述的这句话:

。。。为了检索悬而未决的内容,了解两个意图何时被视为相同是很重要的。人们常犯的一个错误是创建多个PendingEvent对象,其意图仅在“额外”内容上有所不同,期望每次都获得不同的PendingEvent。这种情况不会发生。用于匹配的Intent部分与Intent.filterEquals定义的部分相同


在阅读了您的reccos和references之后,我更改了pIntent实例化并执行了一个setAction(post被编辑以反映这些更改)。“活动”现在获得了额外的捆绑包,但按钮仍不显示,通知也不会消失。这听起来可能有点明显,但使用addAction()添加的按钮仅在便笺展开时显示,这是由用户通过捏缩缩放手势控制的。你试过了吗?关于自动取消不工作,你没有说哪种服务(或者其他组件)会显示注释。对于前台服务,您可能无法取消便笺,除非将其背景化。我在姜饼手机上测试时认为“compat”会显示图标。它们在我的KitKat手机上显示。谢谢你的帮助。