销毁活动堆栈

时间:2012-07-03 15:54:07

标签: android

有些应用程序可以在其中的任何位置注销。例如,您登录然后浏览。您可以使用操作栏或菜单按钮注销。我可以在那个时候调用finish()但是它会弹出最后一个活动。即使我将用户移动到Home Activity,仍然会将堆栈保留在内存中。有没有办法摧毁剩余的堆栈?

2 个答案:

答案 0 :(得分:2)

执行此操作的最简单方法是将堆栈清除回您的家或第一个活动,并传递标识符以退出应用程序。例如:

public class ActivityOne extends Activity {
    public static final String FINISH_THIS = "FINISH_THIS";
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if(intent.hasExtra(FINISH_THIS)) {
            finish();
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(getIntent().hasExtra(FINISH_THIS)) {
            finish();
        }
    }
}

public class ActivityTwo extends Activity {
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId() == R.id.logout) {
            Intent intent = new Intent(this, ActivityOne.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.putExtra(ActivityOne.FINISH_THIS, true);
            startActivity(intent);
        }
        return true;
    }
}

如果ActivityOne是您的堆栈的根,并且ActivityTwo是用户选择注销的选项,则启动清除回ActivityOne的intent将摆脱backstack。如果您希望应用程序在注销时退出,您可以像我使用FINISH_THIS那样传递额外信息,以指示root / home活​​动完成。

另一种方法是在调用setResult(FINISH_THIS)之前调用finish(),其中FINISH_THIS是一个int标识符。然后在堆栈中的所有其他活动中,您将覆盖onActivityResult并检查结果以查看是否需要完成该活动。如果是,则再次设置结果并继续向下传递。

使用我在开头概述的intent方法是清除堆栈的首选方法,因为它不依赖于菊花链结果,但两个选项都运行良好。

答案 1 :(得分:0)

快速而肮脏的方法是onResume验证您是否仍然登录,如果没有则完成它。这样,如果他们回击,它将关闭每个活动,因为它试图打开它们。这也可以防止有人在您希望关闭时重新输入您的活动。

另一个想法是Android: Clear the back stack