在现有任务中从通知启动新活动

4

我的应用接收推送并根据推送类型打开不同的活动。

我在清单中使用android:parentActivityNameTaskStackBuilder 为挂起意图创建合成返回堆栈。

目前为止,一切都很容易。当应用程序未启动时,所有操作都按预期工作。但是如果应用程序在后台运行(任务正在运行),挂起意图也会使用来自清单的定义父项启动所需的活动,但会重置现有任务。问题是,同时由用户启动的其他活动也被清除了。 enter image description here

因此,我要实现的是:

  1. 如果应用程序未启动,则打开带有合成返回堆栈的所需活动(MainActivity)
  2. 如果应用程序正在运行,请尊重当前任务顺序,并将所需的活动推送到其顶部。

使用TaskStackBuilder似乎无法使其正常工作。

我很乐意得到一些见解。

2个回答

6
您不能通过 TaskStackBuilder 来实现此功能。它并不是为此设计的。它总是重置任务使其从头开始。
我会按照以下步骤进行操作:
  • 通知启动一个 Activity。不要使用 TaskStackBuilder,也不要创建任何人工后退栈。如果应用程序当前处于活动状态,则该 Activity 将在应用程序的当前任务中运行,并且将放置在最近打开的 Activity 顶部。
  • 在这个新的 ActivityonCreate() 中,使用 isTaskRoot() 检查此 Activity 是否为任务的根。如果此 Activity 是任务的根,则表示在启动此 Activity 之前该应用程序未处于活动状态。在这种情况下,您可以使用 TaskStackBuilder 创建一个人工后退栈,并以所需方式再次启动该项(这将重置任务)。

我想出了一种不同的解决方案,如果我的根活动已启动,则在我的单例活动助手中启用标志。当我创建我的PendingIntent时,我检查这个标志。如果设置了它,那么我不使用TaskStackBuilder而是使用普通的Intent。这按预期工作,但我认为你的解决方案更优雅。我现在使用一个PushOpenActivity,通过普通Intent路由到真正的目标或构建活动堆栈。对于每个使用此解决方案的人,请记得在您的清单中将android:noHistory="true"设置为此活动。 - JimVanB

0
尝试使用PendingIntent.getActivitiesFLAG_ONE_SHOT,这样我就能够打开正确导航的活动堆栈了。

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