如何终止堆栈中的所有活动

时间:2014-12-04 00:36:14

标签: android android-activity

我的应用程序中有以下活动堆栈: 活动A - >活动B

通常如果应用程序显示活动B,按后退按钮将返回A.这很好。现在我在活动B中有一个按钮,它基本上终止了整个应用程序,因为我希望用户能够在任何给定活动中终止应用程序。当我按下按钮时,我希望应用程序终止所有活动并返回主屏幕。

但是,由于我在堆栈中有活动,在活动B中调用finish()只会返回到A.我应该如何实现它以便活动A也将被销毁?如果从A创建活动B,我仍然希望在堆栈中保留活动A.

这是我的代码,但我认为它不会有太多帮助:

活动A中的

按钮

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

    Button b = (Button) findViewById(R.id.button1);
    b.setText("Start ActB");
    b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), ActivityB.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
        }
    });
}
活动B中的

按钮

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

    Button b = (Button) findViewById(R.id.button1);
    b.setText("Finish");
    b.findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

3 个答案:

答案 0 :(得分:1)

为了清除ActivityA之上的所有活动,你应该做这样的事情。

Intent intent = new Intent(getApplicationContext(), ActivityA.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

要重新启动您的应用,您应该执行以下操作:

Intent intent = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

要在ActivityB中关闭app按钮,您应该使用:

System.exit(0);

答案 1 :(得分:0)

您可以设置活动launchMode和clearTaskOnLaunch标志

供参考:http://developer.android.com/guide/topics/manifest/activity-element.html

答案 2 :(得分:0)

我找到了解决问题的方法:同时使用startActivityForResult()setResult()onActivityResult

这就是我所拥有的:

ActivityA:

public static final int RESULT_CODE_FINISH = 1;

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

    Button b = (Button) findViewById(R.id.button1);
    b.setText("Start ActB");
    b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), ActivityB.class);
            startActivity(intent);
        }
    });
 }

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {     
    switch (resultCode) {
        case RESULT_CODE_FINISH:
            this.finish();
            break;
        default:
            break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

ActivityB:

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

    Button b = (Button) findViewById(R.id.button1);
    b.setText("Finish");
    b.findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            setResult(ActivityA.RESULT_CODE_FINISH);
            finish();
        }
    });
}