android - 如何从 Android 上的通知栏为 Fragments 重新创建向后导航?

标签 android

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/

相关文章:

android - 在 appwidget 中延迟加载图像

java - 致命异常 : AsyncTask #2 An error occured while executing doInBackground() IndexOutOfBoundsException: Invalid index 1, 大小为 1

android - 如何为 Android、Eclipse 启用布局设计器?

android - 如何在 TextView 中从数据库 SQLITE 中获取特定数据?

java - 添加 Firebase 应用内消息时出现问题

Android:lockCanvas() 和 lockCanvas(null) 有什么区别?

android - 可变参数方法警告

Android 5.0 预览表面和捕获的静止图像上的错误裁剪区域

android - 如何在 flutter 的盒子角上制作圆圈?

android - 当 MediaPlayer 在不同的位置播放时,如何从只读的 RandomAccessFile 中读取