本文共 2965 字,大约阅读时间需要 9 分钟。
尽管在“ 创建通知”中描述了为通知设置抽头行为的基本方法,但此页面介绍了如何设置PendingIntent通知的操作,以便创建新 任务和后台堆栈。但究竟如何执行此操作取决于您要启动的活动类型:
经常活动
这是作为应用程序正常用户界面流程的一部分而存在的活动。因此,当用户从通知到达活动时,新任务应包括完整的后备堆栈,允许他们按Back并向上导航应用层次结构。特别活动用户仅在通知启动时才会看到此活动。从某种意义上说,此活动通过提供难以在通知本身中显示的信息来扩展通知UI。所以这个活动不需要后台堆栈。要从通知中启动“常规活动”,请设置 PendingIntent使用,TaskStackBuilder以便按如下方式创建新的后备堆栈。
通过将android:parentActivityName属性添加到<activity> 应用清单文件中的每个 元素,为活动定义自然层次结构。例如:
...
要启动包含后台堆栈活动的活动,您需要创建一个实例TaskStackBuilder 并调用addNextIntentWithParentStack(),并将其传递 Intent给您要启动的活动。
只要您已按上述方法为每个活动定义了父活动,您就可以调用 getPendingIntent()以接收PendingIntent包含整个后台堆栈的活动。
// Create an Intent for the activity you want to startIntent resultIntent = new Intent(this, ResultActivity.class);// Create the TaskStackBuilder and add the intent, which inflates the back stackTaskStackBuilder stackBuilder = TaskStackBuilder.create(this);stackBuilder.addNextIntentWithParentStack(resultIntent);// Get the PendingIntent containing the entire back stackPendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
如有必要,可以Intent通过调用向堆栈中的对象添加参数TaskStackBuilder.editIntentAt()。这有时是必要的,以确保后端堆栈中的活动在用户导航到它时显示有意义的数据。
然后你可以PendingIntent像往常一样传递给通知:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);builder.setContentIntent(resultPendingIntent);...NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);notificationManager.notify(NOTIFICATION_ID, builder.build());
因为从通知启动的“特殊活动”不需要后台堆栈,您可以PendingIntent通过调用创建getActivity(),但您还应该确保已在清单中定义了相应的任务选项。
在清单中,将以下属性添加到 <activity> 元素中。
android:taskAffinity=""结合FLAG_ACTIVITY_NEW_TASK您将在代码中使用的 标志,将此属性设置为空白可确保此活动不会进入应用程序的默认任务。具有应用程序默认关联的任何现有任务都不会受到影响。android:excludeFromRecents="true"从“ 最近”中排除新任务,以便用户不会意外导航回到它。例如:构建并发布通知:
创建一个Intent启动 Activity。Activity通过setFlags()使用标志 FLAG_ACTIVITY_NEW_TASK 和 调用来 设置从一个新的空任务开始 FLAG_ACTIVITY_CLEAR_TASK。PendingIntent 通过调用 创建一个getActivity()。例如Intent notifyIntent = new Intent(this, ResultActivity.class);// Set the Activity to start in a new, empty tasknotifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);// Create the PendingIntentPendingIntent notifyPendingIntent = PendingIntent.getActivity( this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
然后你可以PendingIntent像往常一样传递给通知:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);builder.setContentIntent(notifyPendingIntent);...NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);notificationManager.notify(NOTIFICATION_ID, builder.build());
有关各种任务选项以及后端堆栈如何工作的更多信息,请阅读“ 任务”和“后台堆栈”。
QQ:94297366
微信打赏:
公众号推荐:
转载于:https://blog.51cto.com/4789781/2155103