安卓文档说我可以使用类TaskStackBuilder在从正常流(来自主要主页活动)的另一种方式启动内部活动时重新创建后导航行为,例如当用户单击通知栏时:
"通常,当用户从一个活动导航到下一个活动时,系统会逐步构建后堆栈。但是,当用户使用深度链接进入您的应用程序并在其自己的任务中启动活动时,您需要合成新的后备堆栈,因为活动正在新任务中运行而根本没有任何后备堆栈" - developers.android.com
没关系,但我有一个应用程序最多的片段和很少的活动。我想从通知中启动一个内部片段(称之为FragmentC),所以当用户点击通知栏中的通知时,我的应用程序打开baseActivity,这个活动应该重新创建FragmentC作为第一个显示(我想这样做)通过从通知Intent传递一些args并在baseActivity中询问它来替换显示的片段),但是在这个场景中,当用户向后导航时应用程序完成,因为只有一个活动存活,然后主屏幕显示对于用户来说,这是错误的,我想以这种方式重建一个片段流:
用户点击的通知::
BaseActivity -> FragmentA -> FragmentB -> FragmentC (Visible)
然后用户导航回::
BaseActivity -> FragmentA -> FragmentB (Visible)
用户导航回来::
BaseActivity -> FragmentA (Visible)
用户导航回来::
(Application Finish, showing home screen)
有没有办法从通知中启动内部片段(在通知栏中),并重新创建一个" normal"像使用TaskStackBuilder类那样的片段的后导航流?或者你会如何以干净的方式做到这一点?
我想我可以在baseActivity中手动执行此操作,当我检测到片段是从通知中启动时,但这对我来说是脏代码,我知道有一个TaskStackBuilder类可以更干净地执行此操作方式,但我不知道如何使用它与片段交易。 :S
来源:
https://developer.android.com/training/implementing-navigation/temporal.html#SynthesizeBackStack
https://developer.android.com/training/implementing-navigation/temporal.html#back-fragments
答案 0 :(得分:1)
我创建了一个处理导航的简单类,但基本上,你需要的一切都是从FragmentManager创建一个事务,添加你通常需要的东西,然后使用 addToBackStack 确保您的片段保留在堆栈中
FragmentTransaction ft = FragmentManager.beginTransaction();
ft.addToBackStack(""); //An optional name for this back stack state, or null.
ft.commit();
现在当您按下后退按钮时,自动将前一个片段转到前台
如果您想使用,可以清理堆栈。
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
我认为这是最简单的方法,希望其他人可以补充或提出更好的建议。