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

Android 从现有任务中的通知启动新活动,android,android-intent,android-notifications,android-pendingintent,taskstackbuilder,Android,Android Intent,Android Notifications,Android Pendingintent,Taskstackbuilder,我的应用程序接收推送并根据推送类型打开不同的活动 我使用TaskStackBuilder来实现一个未决的意图,即在我的清单中与android:parentActivityName一起创建一个合成backstack 到目前为止,很容易。当应用程序未启动时,所有功能均按预期工作但如果应用程序在后台(任务正在运行),则挂起的意图也会使用清单中定义的父级启动所需的活动,但会重置现有任务。问题是,同时由用户启动的其他活动也会被清除 因此,a希望实现的是: 如果应用程序未启动,请使用合成后退(MainAct

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

我使用
TaskStackBuilder
来实现一个未决的意图,即在我的清单中与
android:parentActivityName
一起创建一个合成backstack

到目前为止,很容易。当应用程序未启动时,所有功能均按预期工作但如果应用程序在后台(任务正在运行),则挂起的意图也会使用清单中定义的父级启动所需的活动,但会重置现有任务。问题是,同时由用户启动的其他活动也会被清除

因此,a希望实现的是:

  • 如果应用程序未启动,请使用合成后退(MainActivity)打开所需的活动
  • 如果应用程序正在运行,请遵守当前任务顺序,只需将所需活动推到其上即可
  • 我似乎无法使用
    TaskStackBuilder


    我很乐意得到一些见解

    使用
    TaskStackBuilder
    无法真正做到这一点。它不是为此而设计的。它总是在开始时重置任务

    我会这样做:

    • 让通知启动
      活动
      。不要使用
      TaskStackBuilder
      ,也不要创建任何人工后堆栈。如果应用程序当前处于活动状态,则此
      活动
      将在应用程序的当前任务中运行,并将置于最近打开的
      活动
      之上
    • 在这个新的
      活动的
      onCreate()
      中,使用
      isTaskRoot()
      检查这个
      活动是否是任务的根。如果此
      活动
      是任务的根,则表示在启动此
      活动
      之前,应用程序未处于活动状态。在这种情况下,您可以使用
      TaskStackBuilder
      创建一个人工后堆栈,然后以您想要的方式再次启动该对象(这将重置任务)

    我提出了一个不同的解决方案,它在启动根活动时在我的singleton activity helper中启用一个标志。当我创建Pending帐篷时,我会检查此标志。如果设置了,那么我不会使用
    TaskStackBuilder
    ,而是使用普通的意图。这与预期的一样有效,但我认为您的解决方案更加优雅。我现在使用一个PushOpenActivity,它通过正常意图路由到真正的目标,或者构建活动堆栈。对于使用此解决方案的每个人,请记住在清单中为此活动设置
    android:noHistory=“true”