如何更新通知而不影响待处理的意图及其有效负载?

时间:2014-09-27 17:14:57

标签: android android-pendingintent

我正在使用以下代码创建通知:

Intent intent = new Intent(this, GetStockQuote.class);
            intent.putExtra("abc", abcObject);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);

            /* Build the notification */
            Notification notification = new Notification.Builder(this)
                                     .setContentTitle(abcObject.getCode())
                                     .setContentText(abcObject.getText())
                                     .setAutoCancel(false)
                                     .setSmallIcon(R.drawable.ic_launcher)
                                     .setContentIntent(pIntent).build();
 NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            notificationManager.notify(notificationID,notification);
            Log.i(TAG,"notification.notified");

正如您所看到的,附加到通知的PendingIntent带有有效负载。它是自定义类的对象。

现在我在服务中更新通知。我了解如果您必须更新通知(不创建新通知),则必须指定我正在执行的notificationID

这是用于更新上面创建的通知的服务中的代码:

Intent intent = new Intent(this, GetStockQuote.class);
                PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);   
 Notification notification=new Notification.Builder(this)
                                .setContentTitle(newTitle)
                                .setContentText(newBody)
                                .setSmallIcon(R.drawable.ic_launcher)
                                .setContentIntent(pIntent)
                                .build();

                /*Get instance of Notification Manager and show the notification*/
                        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                        notificationManager.notify(notificationID,notification);

代码使用新内容更新现有通知,但PendingIntent不包含有效内容。

我无法访问服务中的有效负载。因此,我希望只使用新的textContent更新通知服务,而不会影响在此创建期间设置的有效负载。

现在的问题是我有很多这样的通知。它们中的每一个都有唯一的有效负载,但Intent中的目标类保持不变。

更新通知时是否有办法保留有效负载?

2 个答案:

答案 0 :(得分:6)

您正在为所有通知设置相同ID的待处理意图。

使用此

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

而不是

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

答案 1 :(得分:0)

但是我不确定它是唯一可以帮助您的方式或最佳方式:

首先为您的类定义应传递给intent的解析器方法。你需要这两种方法:

public static String getStringObject(YourObj obj) // return your fileds as string
public static YourObj parse(String input) // parse the string and create an object

然后,每次要显示新通知时,请添加以下内容:

SharedPreferences sp = getSharedPreferences("pref",MODE_PRIVATE);
Set<String> notifications = sp.getStringSet("nots", null);
if(notifications==null){
    notifications = new HashSet<String>();
}
notifications.add(id + "|" + YourObject.getStringObject(abcObject));
sp.edit().putStringSet("nots", notifications).commit();

在您的服务中,您将通过致电(例如第一次有效通知)访问您的对象:

YourObj obj = YourObj.parse(new ArrayList<String>(sp.getStringSet("nots", null)).get(0).split("|")[1]);
// I didn't check if list is null. You should do it

您必须更新此活动列表并从列表中删除已删除的通知。您可以通过设置setDeleteIntent进行通知来使用此功能。