2012-07-03 213 views
0

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

回答

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将摆脱返回堆栈的意图的选项。如果您希望在注销时退出该应用程序,则可以像使用FINISH_THIS那样传递额外的信号来指示完成根/家活动。

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

使用我在开始概述的intent方法是清除堆栈的首选方法,因为它不依赖菊花链连接结果,但两个选项都工作得很好。

0

一个快速和肮脏的方法来做到这一点将onResume验证你仍然登录,如果不是,那么完成它。这样,如果他们回击,它会关闭每个活动,试图打开它们。这还会阻止某人在您期望关闭时使用应用管理器重新输入您的活动。

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