删除活动并将活动添加到后台堆栈

导航抽屉的 “交叉导航到较低层次结构级别之后的系统返回”部分中,他们说:

如果用户从导航抽屉导航到较低层次的屏幕并且屏幕具有直接父级,则重置后退堆栈并且后退指向目标屏幕的父级。 此返回行为与用户从通知导航到应用程序时的行为相同。

重置后栈

我知道可以通过使用FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_NEW_TASK启动活动来重置后台堆栈,但这似乎在这里不可用,因为它不会为Lower 1.1.1创建后台堆栈。

知道如何从堆栈中删除TopView2,同时在启动Lower 1.1.1时添加TopView1 – > Lower 1.1返回堆栈吗? 考虑到导航抽屉文档中提到的这一点,我期待一个简单的解决方案。

Solutions Collecting From Web of "删除活动并将活动添加到后台堆栈"

编辑合成版:

1)在清单文件中声明应用程序的分层导航结构。

2)应用的根活动应该在应用层次结构中的TopView之间执行视图切换。*

3)层次结构中较低的活动应执行“选择性向上”导航。

* 重要提示:当事务处于水平导航时(例如切换选项卡或导航抽屉顶视图时),不应将事务添加到后台堆栈。

详细描述:

出于以下原因,您应该避免将Intent Flags与导航抽屉等新导航模式一起使用

  • Intent Flags实际上不是一个API。
  • 某些标志仅在精确组合中起作用。
  • 许多标志与大多数第三方应用程序无关。
  • 与活动launchMode重叠/冲突。
  • 令人困惑的文件。
  • 实施可以成为一个反复试验的过程。

相反,请选择新的Navigation API:

  • Jelly Bean及以上版本的Native Up导航。
  • 基于清单中每个指定的分层元数据。
  • 支持库通过NavUtils为早期的Android版本提供了相同的function。
  • TaskStackBuilder为跨任务导航提供了额外的实用程序。

所以回答你的问题一般的想法是:

1)您需要使用android:parentActivityName属性(和相应的元素)声明清单文件中每个活动的逻辑父代,如:

  ...   ...           

2)在根活动中,抽屉项目选择应通过替换活动的当前片段内容来启动“视图切换”操作。

视图切换遵循与列表或选项卡导航相同的基本策略,因为视图切换不会创建导航历史记录 。 此模式应仅用于任务的根活动,使某些forms的向上导航对导航层次结构中的活动保持活动状态(在您的情况下为低1.1和低1.1.1)。 这里重要的是你不需要从堆栈中删除TopView2,而是在将视图(或片段id)的位置作为额外的位置传递之前执行视图切换。

在你的root Activity中做这样的事情:

 @Override protected void onDrawerItemSelected(int position) { // Update the main content by replacing fragments CategoryFragment fragment = new CategoryFragment(); Bundle args = new Bundle(); args.putInt(RootDrawerActivity.ARG_SORT, position); fragment.setArguments(args); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.content_frame, fragment).commit(); // Update selected item and title, then close the drawer setDrawerItemChecked(position, true); setTitle(getResources().getStringArray(R.array.drawer_array)[position]); closeDrawer(); } 

3)然后在层次结构中降低(即Lower1.1),您应该执行“选择性向上”导航, 在过程中重新创建任务堆栈

选择性向上允许用户随意跳过应用程序的导航层次结构。 应用程序应该对此进行处理,因为它使用TaskStackBuilder或类似方法来处理来自不同任务的导航, 替换当前任务堆栈 (这是您想要的!)。 这是导航抽屉的唯一forms,应该在任务的根活动之外使用。

 @Override protected void onDrawerItemSelected(int position) { TaskStackBuilder.create(this) .addParentStack(RootDrawerActivity.class) .addNextIntent(new Intent(this, RootDrawerActivity.class) .putExtra(RootDrawerActivity.ARG_SORT, position)) .startActivities(); } 

参考文献:

http://developer.android.com/training/implementing-navigation/ancestral.html https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android