删除活动堆栈

时间:2018-12-08 19:17:42

标签: java android

我有3个活动:A-> B-> C

用户从活动A开始。转到B时,他可以按返回并返回到A。 但是...当用户从B转到C时,我希望A和B将被删除,并且单击返回时用户将退出应用程序。

我尝试过:

Intent intent = new Intent(B.this, C.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

但在背面仍然指向B。如果这样做:

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

用户返回A,所以。这不是我所需要的。

5 个答案:

答案 0 :(得分:2)

onBackPressed() C中覆盖Activity

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

这将导致在同一任务中运行的所有Activity完成。如果用户在最近的任务窗口中通过点击再次启动应用程序,则会显示Activity A。

答案 1 :(得分:1)

B开始startActivityForResult()活动:

Intent intent = new Intent(A.this, B.class);
startActivityForResult(intent, 100);

并在类A startActivityForResult()中进行覆盖:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == 100) {
        if (resultCode == 1) {
            finish();
        }
    }
}

现在在B类中,将结果设置为发送回活动A

Intent intent = new Intent(VerifyPhoneActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
setResult(1);
finish();

答案 2 :(得分:1)

100%工作。 尝试像这样启动活动C。 Intent intent = new Intent(this,ActivityC.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity();

答案 3 :(得分:0)

如果我理解的正确,则可以使用SharedPreferences实现此目的:

在您的活动A中添加以下内容:

public class ActivityA extends AppCompatActivity {

SharedPreferences prefs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);

    if (savedInstanceState == null){
        SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
        editor.putBoolean("CloseApp", false);
        editor.commit();
    }

}

@Override
protected void onResume() {
    super.onResume();
    boolean finish = prefs.getBoolean("CloseApp", false);
    if (finish){
        this.finish();
    }
}

在活动B中:

public class ActivityB extends AppCompatActivity {

SharedPreferences prefs;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);

    prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);

}

@Override
protected void onResume() {
    super.onResume();

    boolean finish = prefs.getBoolean("CloseApp", false);
    if (finish){
        this.finish();
    }
}

活动C:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_third);

    SharedPreferences.Editor editor = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE).edit();
    editor.putBoolean("CloseApp", true);
    editor.commit();
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    this.finish();
}

应该可以。

答案 4 :(得分:0)

如果您的应用程序从JELLY_BEAN开始运行,则只需在Activity C中编写即可。

  @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        finishAffinity();
    }

如果您的应用在JELLY_BEAN下工作,则可以使用以下解决方案:

活动C:

   @Override
    public void onBackPressed() {
        Intent i = new Intent(C.this,A.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.putExtra("BackFromC",true);
        startActivity(i);
        super.onBackPressed();
    }

onCreate中的活动A:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);

        if(getIntent() != null){
            if(getIntent().getBooleanExtra("BackFromC",false)){
                finish();
            }
        }

        ... your Code 
    }