int id = 0;
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.setContentTitle(context.getString(R.string.notification_on_the_move_gps_title))
.setContentText(context.getString(R.string.notification_on_the_move_text));
builder.setStyle(new NotificationCompat.BigTextStyle().bigText(context.getString(R.string.notification_on_the_move_gps_big_text)));
Intent mainIntent = new Intent(context, MainActivity.class);
Intent turnOffIntent = new Intent(context, MainActivity.class);
turnOffIntent.putExtra(MainApp.KEY_TURN_OFF_NOTIFICATION_ID, id);
TaskStackBuilder mainBuilder = TaskStackBuilder.create(context);
mainBuilder.addParentStack(MainActivity.class);
mainBuilder.addNextIntent(mainIntent);
PendingIntent mainPendingIntent = mainBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(mainPendingIntent);
TaskStackBuilder turnOffBuilder = TaskStackBuilder.create(context);
turnOffBuilder.addParentStack(MainActivity.class);
turnOffBuilder.addNextIntent(turnOffIntent);
PendingIntent turnOffPendingIntent = turnOffBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
builder
.setSmallIcon(R.drawable.ic_stat_notification)
.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher))
.setAutoCancel(true)
.setLights(Color.BLUE, 500, 500)
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
.addAction(R.drawable.ic_stat_notification, "Open", mainPendingIntent)
.addAction(R.drawable.ic_stat_notification_off, "Turn off", turnOffPendingIntent);
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(id, builder.build());
单击未展开或展开的通知正文或打开操作按钮始终使用(KEY_TURN_OFF_NOTIFICATION_ID)额外传输意图。
我试图放弃TaskStackBuilder并简单地创建PendingIntent
:
Intent mainIntent = new Intent(context, MainActivity.class);
PendingIntent piMain = PendingIntent.getActivity(context, 0, mainIntent, 0);
Intent turnOffIntent = new Intent(context, MainActivity.class);
turnOffIntent.putExtra(MainApp.KEY_TURN_OFF_NOTIFICATION_ID, id);
PendingIntent piTurnOff = PendingIntent.getActivity(context, 0, turnOffIntent, 0);
但是,同样的效果:(
如果我省略setContentIntent()
,自然地,点击通知正文无效。
如果我在设置操作后设置setContentIntent()
,那么MainActivity中永远不会收到额外内容。
答案 0 :(得分:15)
来自doc:
由于这种行为,为了检索PendingIntent,重要的是要知道两个Intent何时被认为是相同的。人们常犯的一个错误是使用Intents创建多个PendingIntent对象,这些对象只在其“额外”内容中有所不同,期望每次都获得不同的PendingIntent。这不会发生。用于匹配的Intent部分与Intent.filterEquals定义的部分相同。如果你使用两个与Intent.filterEquals相同的Intent对象,那么你将获得两个相同的PendingIntent。
所以你必须像Intent.filterEquals
方法那样使这些意图不同:
也就是说,如果他们的行为,数据,类型,类别和类别相同。这不会比较意图中包含的任何额外数据。
作为旁注,我在处理firefox for android here的下载通知时遇到了同样的问题
答案 1 :(得分:3)
因此,PendingIntent.FLAG_UPDATE_CURRENT
标志只会覆盖额外内容,如果您正在创建只有附加内容更改的新意图。
尝试添加不同的
intent.setAction("DISTINCT.ACTION.HERE")
或intent.addCategory("DISTINCT.CATEGORY.HERE")
每个意图。
欢呼: - )答案 2 :(得分:0)
区分这两个请求的正确方法是为每个请求设置唯一的requestCode
。
以上述代码为例,分配唯一的requestCode
如下:
int mainRequestCode = 1;
int turnOffRequestCode = 2;
Intent mainIntent = new Intent(context, MainActivity.class);
PendingIntent piMain = PendingIntent.getActivity(context, mainRequestCode, mainIntent, 0);
Intent turnOffIntent = new Intent(context, MainActivity.class);
turnOffIntent.putExtra(MainApp.KEY_TURN_OFF_NOTIFICATION_ID, id);
PendingIntent piTurnOff = PendingIntent.getActivity(context, turnOffRequestCode, turnOffIntent, 0);