从堆栈中删除一系列活动

时间:2017-05-23 01:32:08

标签: android android-activity back

我有一个活动A,然后转到B然后是C,然后是D然后是F,在我完成FI之后想再次跳到B,但所有活动C,D和F都需要从历史中移除但是仍然可以从B回到A,有没有办法可以做到这一点?谢谢!

3 个答案:

答案 0 :(得分:0)

您可以截取活动F(或其他事件)中的后退按钮事件,并使用intent返回活动B.

@override
public void onBackPressed(){
    // Do what you need done here 
    Intent intent = new Intent(this, ActivityB.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    // if you need to pass data back to ActivityB
    //intent.putExtra("tagName", yourData);
    startActivity(intent);
    this.finish();
}

将标记添加为xbadal建议是正确的想法,但根据Android文档,您似乎需要使用FLAG_ACTIVITY_CLEAR_TOP

来自Android文档:

  

如果设置,则正在启动的活动已在运行中   当前任务,然后而不是启动它的新实例   活动,其上的所有其他活动将被关闭   这个意图将作为一个传递到(现在在顶部)旧活动   新的意图。

     

例如,考虑一个由活动组成的任务:A,B,C,D。   如果D调用带有解析为的Intent的startActivity()   活动B的组成部分,然后C和D将完成,B接收   给定的Intent,导致堆栈现在为:A,B。

https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP

根据调用intent时设置的其他标志,您可能需要通过调用getFlags()来检查已包含哪些标志,并使用{{1}删除冲突的标志}。

答案 1 :(得分:0)

没有直接的方法。只需替代,您可以使用以下代码来查看目的。

请在F活动的onBackPressed方法中使用 navigateToB

注意:开始结果的所有活动。请参阅活动代码 B F 以了解相关信息。除 B A 之外的所有活动finish

<强> A.java

public class A {

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(data != null && data.getBooleanExtra("shouldClose", false)) {
            finish();
        }
    }
}

<强> B.java

public class B {

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(data != null && data.getBooleanExtra("shouldClose", false)) {
            Intent i = new Intent();
            i.putExtra("shouldClose", false);
            setResult(RESULT_OK, i);
            finish();
        }
    }
}

<强> C.java

public class C {

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(data != null && data.getBooleanExtra("shouldClose", false)) {
            Intent i = new Intent();
            i.putExtra("shouldClose", true);
            setResult(RESULT_OK, i);
            finish();
        }
    }
}

<强> D.java

public class D {

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(data != null && data.getBooleanExtra("shouldClose", false)) {
            Intent i = new Intent();
            i.putExtra("shouldClose", true);
            setResult(RESULT_OK, i);
            finish();
        }
    }
}

<强> F.java

public class F {

    public void navigateToB() {
        Intent i = new Intent();
        i.putExtra("shouldClose", true);
        setResult(RESULT_OK, i);
        finish();
    }

    @Override
    public void onBackPressed() {
        navigateToB();
    }
}

答案 2 :(得分:0)

试试这个。这将清除您之前的所有堆栈并开始新的活动

 Intent intent= new Intent(F.this, B.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(intent);
    ActivityCompat.finishAffinity(this)