有些应用程序可以在其中的任何位置注销。例如,您登录然后浏览。您可以使用操作栏或菜单按钮注销。我可以在那个时候调用finish()但是它会弹出最后一个活动。即使我将用户移动到Home Activity,仍然会将堆栈保留在内存中。有没有办法摧毁剩余的堆栈?
答案 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验证您是否仍然登录,如果没有则完成它。这样,如果他们回击,它将关闭每个活动,因为它试图打开它们。这也可以防止有人在您希望关闭时重新输入您的活动。