如何在Android通知栏中为Fragments重新创建后退导航?

3
安卓文档中提到,我可以使用TaskStackBuilder类来重新创建后退导航行为,当内部活动从其他方式启动时(从主页活动以外的方式),例如当用户点击通知栏时:

"通常,系统会逐步构建返回堆栈,因为用户从一个活动导航到另一个活动。然而,当用户通过深层链接进入您的应用并在其自己的任务中启动活动时,您需要合成新的返回堆栈,因为该活动在没有任何返回堆栈的新任务中运行。" - developers.android.com

没问题,但我的应用程序主要由片段和少量活动组成。我想从通知中启动内部片段(称之为FragmentC),因此当用户在通知栏中单击通知时,我的应用程序将打开baseActivity,并且此活动应重新创建FragmentC作为第一个显示的片段(我认为通过从通知意图传递一些参数并要求它在baseActivity中替换正在显示的片段来实现此目的),但在这种情况下,当用户向后导航时,应用程序会停止,因为只有一个活动处于活动状态,然后向用户显示主屏幕,这是错误的,我希望以这种方式重新创建片段流:

Notification clicked by the user ::

   BaseActivity -> FragmentA -> FragmentB -> FragmentC (Visible)

Then the user navigate back ::

   BaseActivity -> FragmentA -> FragmentB (Visible)

User navigate back ::

   BaseActivity -> FragmentA (Visible)

User navigate back ::

   (Application Finish, showing home screen)

有没有一种方法可以从通知栏中启动内部片段,并重新创建“正常”的后向导航流程,就像使用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


你找到更简洁的方法了吗?如果找到了,请分享。 - saintjab
1个回答

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);

我认为这是最简单的方法,希望其他人能够补充或提出更好的建议。

那可以,但我需要其他的东西。 - Viktor Valencia

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