android 文档说,当从正常流程(从主主页 Activity )的另一种方式启动内部 Activity 时,例如当用户单击通知栏时,我可以使用类 TaskStackBuilder 重新创建后退导航行为:
"Ordinarily, the system incrementally builds the back stack as the user navigates from one activity to the next. However, when the user enters your app with a deep link that starts the activity in its own task, it's necessary for you to synthesize a new back stack because the activity is running in a new task without any back stack at all." - developers.android.com
没关系,但我有一个应用程序大部分由 fragment 和很少的 Activity 组成。我想从通知中启动一个内部 fragment (称之为 FragmentC),所以当用户单击通知栏中的通知时,我的应用程序打开 baseActivity,并且此 Activity 应该重新创建 FragmentC 作为第一个显示(我想这样做通过从通知 Intent 传递一些参数,并在 baseActivity 中要求它替换显示的 fragment ),但在这个场景中,当用户导航到向后应用程序完成时,因为只有一个 Activity Activity ,然后显示主屏幕对用户来说,这是错误的,我想以这种方式重新创建 fragment 流:
Notification clicked by the user ::
BaseActivity -> FragmentA -> FragmentB -> FragmentC (Visible)
然后用户导航回来::
BaseActivity -> FragmentA -> FragmentB (Visible)
用户向后导航::
BaseActivity -> FragmentA (Visible)
用户向后导航::
(Application Finish, showing home screen)
有没有办法从通知(在通知栏中)启动一个内部 fragment ,并为 fragment 重新创建一个“正常”的后退导航流,比如使用 TaskStackBuilder 类?或者你会如何以干净的方式做到这一点?
我想当我检测到 fragment 是从通知中启动时,我可以在 baseActivity 中手动执行此操作,但这对我来说是脏代码,而且我知道有一个 TaskStackBuilder 类可以更干净地执行此操作方式,但我找不到关于如何将它与 fragment 事务一起使用的任何信息。 :S
来源:
https://developer.android.com/training/implementing-navigation/temporal.html#SynthesizeBackStack
https://developer.android.com/training/implementing-navigation/temporal.html#back-fragments
最佳答案
我已经创建了一个处理导航的简单类,但本质上,您需要的一切都是从 FragmentManager 创建一个事务,添加您通常需要的内容,然后使用 addToBackStack 来保证您的 fragment 保留在堆栈中
FragmentTransaction ft = FragmentManager.beginTransaction();
ft.addToBackStack(""); //An optional name for this back stack state, or null.
ft.commit();
现在当你按下后退按钮时,前一个 fragment 会自动回到前台
如果你想使用,你可以清理你的堆栈。
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
我认为这是最简单的方法,希望其他人可以补充或建议更好的方法。
关于android - 如何从 Android 上的通知栏为 Fragments 重新创建向后导航?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40722181/