我正在使用以下代码创建通知:
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
中的目标类保持不变。
更新通知时是否有办法保留有效负载?
答案 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
进行通知来使用此功能。