使用PendingIntent传递数据

8
我正在尝试提醒用户收到了一条消息。我已经添加了一个操作,期望在通知上显示一个小红球图标。如果用户点击小红球,主活动将启动并检查额外的包,看到要执行与正常启动不同的操作指令。
通知会显示在目标手机(运行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();

        }

为什么通知中的图标没有显示?我已将 setAutoCancel 设置为 true,希望只需轻触通知即可使其消失。但实际上它会启动应用程序,而不提供任何额外的信息包。

谢谢, 迪恩
1个回答

19

这个话题已经在现有的问题中有所涉及。

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

第一点:使用以下代码创建待处理意图。最后一个参数中标志的选择非常重要:

PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

第二点:挂起的意图被存储在全局系统表中,只有它们所创建的意图的特定部分是查找表中使用的“键”的一部分。额外的内容不是键的一部分,因此如果您希望两个意图映射到两个不同的挂起意图,请确保它们以其他某种方式不同,例如具有不同的操作、数据或类型。

这个示例更改了操作:

Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("whattodo", "showmessage");
// add this:
intent.setAction("showmessage");

只要与同一类别的其他地方使用的不同,那么动作可以是任何事情。

待定意图的最新 Javadoc 中有很好的解释,特别是我引用的这句话:

......重要的是要知道当检索 PendingIntent 时何时认为两个 Intent 是相同的。人们经常犯的一个错误是创建多个 PendingIntent 对象,其中 Intents 只在它们的“额外”内容上有所变化,期望每次都会得到不同的 PendingIntent。这是不会发生的。用于匹配的 Intent 部分是由 Intent.filterEquals 定义的相同部分。


在阅读了您的建议和参考资料后,我更改了pIntent实例化并进行了setAction(帖子已编辑以反映这些更改)。现在活动正在获取额外的捆绑包,但按钮仍然不显示,通知也无法解除。 - Dean Blakely
这可能听起来很明显,但是使用addAction()添加的按钮只有在用户通过捏合缩放手势展开笔记时才会显示。你试过了吗? - x-code
关于自动取消无法正常工作,你没有说明是哪种服务(或者可能是其他组件)显示了这个提示。对于前台服务,除非将其转为后台运行,否则您可能无法取消提示。 - x-code
我在我的姜饼手机上进行测试,认为“compat”会显示图标。它们在我的KitKat手机上显示。感谢您的帮助。 - Dean Blakely

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