1

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

4

2 回答 2

3

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

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 的意图将摆脱后台堆栈。如果您希望应用程序在注销时退出,您可以像我对 FINISH_THIS 所做的那样传递一个额外的信号来指示 root/home 活动完成。

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

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

于 2012-07-03T16:59:50.117 回答
0

一种快速而肮脏的方法是 onResume 验证您是否仍然登录,如果没有,则完成它。这样,如果他们反击,它将在尝试打开它们时关闭每个活动。这也可以防止有人在您希望它关闭时使用应用程序管理器重新输入您的活动。

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

于 2012-07-03T15:57:50.740 回答