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

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

【问题讨论】:

    标签: android android-intent android-activity back-stack


    【解决方案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);
    

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

    希望这会有所帮助..

    【讨论】:

    • 也不工作... :(
    猜你喜欢
    • 2016-10-14
    • 2013-09-08
    • 2018-08-09
    • 1970-01-01
    • 2011-09-19
    • 2017-08-11
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多