我想在我的Android应用程序中修改后台堆栈:
现在,这是流程:
A - > B - > C - > D - > E - > ˚F
我希望能够修改后台堆栈,这样当用户进入活动F时,D和E将从堆栈中删除。所以流量是F - > C如果用户击中背部。
此外,从F,用户可以进入活动B,这也应该擦除C,D,E和F.
我已经看到了一些关于能够清除堆栈或删除顶部项目的信息,但是我想在触发活动时从堆栈中删除一些项目。
非常感谢任何帮助。
答案 0 :(得分:9)
您可以使用从F到C的标志intent.FLAG_ACTIVITY_CLEAR_TOP
构建一个意图。然后您必须使用intent调用startActivity()并触发此事件以发生onBackPressed或类似的事情。
Intent i = new Intent(this, C.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i)
请参阅此答案,该答案还涉及确保在您导航回C时不会重新启动C:https://stackoverflow.com/a/11347608/1003511
FLAG_ACTIVITY_CLEAR_TOP
将要做的是回到堆栈上最新的活动C实例,然后清除它上面的所有内容。但是,这可能会导致重新创建活动。如果您想确保它与活动的实例相同,请同时使用FLAG_ACTIVITY_SINGLE_TOP
。来自文档:
上例中活动B的当前运行实例将会 要么接收你从这里开始的新意图 onNewIntent()方法,或者自己完成并重新使用new 意图。如果它已宣布其启动模式为“多个”( 默认情况下,您没有设置FLAG_ACTIVITY_SINGLE_TOP 意图,然后它将完成并重新创建;所有其他发射 模式或如果设置了FLAG_ACTIVITY_SINGLE_TOP,那么此Intent将是 传递给当前实例的onNewIntent()。
编辑:这是一个类似于您想要做的代码示例:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Intent a = new Intent(this, C.class);
a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(a);
return true;
}
return super.onKeyDown(keyCode, event);
}
答案 1 :(得分:2)
您需要的是android:excludeFromRecents="true"
,必须在清单文件的活动代码中添加。它会阻止所有活动进入堆栈,并将此标记转换为清单中的活动标记。
示例代码
<activity
android:name="com.xx.xx.ActivityName"
android:excludeFromRecents="true"
</activity>
并确保在那些您不希望加入活动堆栈的活动中调用finish()
(在启动另一个活动之后)方法。