清除活动回栈[重复]

Posted

技术标签:

【中文标题】清除活动回栈[重复]【英文标题】:Clear Activity back stack [duplicate] 【发布时间】:2013-08-16 00:45:12 【问题描述】:

我从活动 A->B->C->D->E 开始。当我从 D->E 开始时,堆栈中应该没有活动,但是,用户可以使用 D 中的后退按钮并转到C(不刷新Activity C,和正常的返回功能一样)

【问题讨论】:

【参考方案1】:

您可以在所有要关闭的活动(A、B、C、D)中添加BroadcastReceiver

public class MyActivity extends Activity 
    private FinishReceiver finishReceiver;
    private static final String ACTION_FINISH = 
           "com.mypackage.MyActivity.ACTION_FINISH";

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        finishReceiver= new FinishReceiver();
        registerReceiver(finishReceiver, new IntentFilter(ACTION_FINISH));
    

    @Override
    protected void onDestroy() 
        super.onDestroy();

        unregisterReceiver(finishReceiver);
    

    private final class FinishReceiver extends BroadcastReceiver 
        @Override
        public void onReceive(Context context, Intent intent) 
            if (intent.getAction().equals(ACTION_FINISH)) 
                finish();
        
    

...并通过调用...关闭它们

sendBroadcast(new Intent(ACTION_FINISH));

...在活动 E 中。也检查 this nice example。

【讨论】:

你是一个救生员......非常感谢...... :) 不幸的是,在这个问题上有太多接近投票者,尽管它与提到的副本略有不同。上面的解决方案可能看起来过大,但是,它非常灵活和强大:) 感谢分享解决方案。这种情况肯定是不同的,新的activity之前没有在back stack中。 这是一个很棒的解决方案。比其他的更强大、更清晰。【参考方案2】:

添加标志 FLAG_ACTIVITY_CLEAR_TOP 到您的意图中,以在您启动 E Activity 时清除其他活动表单返回堆栈,例如:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

然后开始你的活动:

startActivity(intent)

更多信息:Task and BackStack

【讨论】:

但这只有在 Activity 已经在堆栈中时才有效 @sabya : 请解释一下你的问题,有点不清楚 来自文档:“如果设置,并且正在启动的活动已经在当前任务中运行,那么不会启动该活动的新实例,而是在它之上的所有其他活动被关闭,这个 Intent 将作为一个新的 Intent 传递给(现在在最上面的)旧活动。” (见developer.android.com/reference/android/content/Intent.html @Arash:我从活动 A 开始,然后移动到活动 B,然后是 C、D,然后我从活动 D 移动到活动 E。但是当用户从 E 单击后退按钮时,应该没有活动在堆栈中。 @sabya : 如果你的活动在相同的任务中,所以这个标志应该清除你的后台堆栈,只需在你开始最后一个活动之前添加这个标志【参考方案3】:

向您的项目添加标志,它将清除堆栈中的所有活动

Intent intent = new Intent(getApplicationContext(),MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |  Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

这是清除堆栈中已经存在的活动的正确方法

希望这会有所帮助..

【讨论】:

也不工作... :(

以上是关于清除活动回栈[重复]的主要内容,如果未能解决你的问题,请参考以下文章

活动回栈 FLAG_ACTIVITY_NEW_TASK

清除堆栈活动并完成[重复]

Android中维护标准应用Activity回栈状态(使用singleTask启动模式)

当 Fragment 被替换并放入回栈(或删除)时,它是不是保留在内存中?

Android - 清除导航回栈

使用片段清除回栈