Android:清除活动堆栈

我在我的应用程序中有几个活动。 stream程非常复杂。 当我点击退出应用程序naviagateslogin屏幕,并从那里用户可以通过取消buton(调用system.exit(0) )退出

当我退出或返回button时,系统从堆栈调用活动:(当我到达login屏幕时,如何清除堆栈中的所有活动?调用finish()不实际,因为有太多的活动,有些活动不应该是当它们处于活动状态时closures,如本机摄像头调用活动。

 validateuser logoutuser = new validateuser(); logoutuser.logOut(); Intent loginscreen = new Intent(homepage.this, Login2.class); (homepage.this).finish(); loginscreen.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(loginscreen); 

你们大多数人都错了。 如果您想要closures现有的活动堆栈而不pipe其中内容是什么,并创build新的根目录,则正确的标志集合如下所示:

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

从文档 :

public static final int FLAG_ACTIVITY_CLEAR_TASK
在API级别11中添加

如果在传递给Context.startActivity()的Intent中设置,则此标志将导致在活动启动之前将与活动关联的任何现有任务清除。 也就是说,活动成为一个空的任务的新根,任何旧活动都结束了。 这只能与FLAG_ACTIVITY_NEW_TASK结合使用。

当您在最后一次活动中调用startActivity时,您始终可以使用它

Intent.FLAG_ACTIVITY_CLEAR_TOP

作为这个意图的一面旗帜。

阅读更多关于这里的国旗。

下面是一个简单的辅助方法,用于启动一个新的活动,作为从API级别4直到当前版本17的新顶级活动:

 static void startNewMainActivity(Activity currentActivity, Class<? extends Activity> newTopActivityClass) { Intent intent = new Intent(currentActivity, newTopActivityClass); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) intent.addFlags(0x8000); // equal to Intent.FLAG_ACTIVITY_CLEAR_TASK which is only available from API level 11 currentActivity.startActivity(intent); } 

从你当前的活动中这样调用它:

 startNewMainActivity(this, MainActivity.class); 

清除活动后面的代码如下:

 Intent intent = new Intent(Your_Current_Activity.this, Your_Destination_Activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); 

完成

在我的情况下,LoginActivity也被closures了。 结果是,

 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK 

没有帮助。

但是,设置

 Intent.FLAG_ACTIVITY_NEW_TASK 

帮助过我。

 Intent intent = new Intent(LoginActivity.this, Home.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //It is use to finish current activity startActivity(intent); this.finish(); 

我注意到,你问了一个不依赖于finish()的解决scheme,但我想知道这是否可以帮助。

我跟踪了一个退出标志是否与一个静态的类variables,这保持了整个应用程序的使用寿命。 在每个相关活动的onResume() ,使用

 @Override public void onResume() { super.onResume(); if (ExitHelper.isExitFlagRaised) { this.finish(); } } 

ExitHelper类

 public class ExitHelper { public static boolean isExitFlagRaised = false; } 

比方说在mainActivity中,用户按下一个button退出 – 你可以设置ExitHelper.isExitFlagRaised = true; 然后finish() 。 此后,自动恢复的其他相关活动也将完成。

这个决定工作正常:

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 

但新的活动推出很长时间,你会看到一些白屏。 如果这很关键,那么使用这个解决方法:

 public class BaseActivity extends AppCompatActivity { private static final String ACTION_FINISH = "action_finish"; private BroadcastReceiver finisBroadcastReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); registerReceiver(finisBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { finish(); } }, new IntentFilter(ACTION_FINISH)); } public void clearBackStack() { sendBroadcast(new Intent(ACTION_FINISH)); } @Override protected void onDestroy() { unregisterReceiver(finisBroadcastReceiver); super.onDestroy(); } } 

如何使用它:

 public class ActivityA extends BaseActivity { // Click any button public void startActivityB() { startActivity(new Intent(this, ActivityB.class)); clearBackStack(); } } 

缺点:必须在堆栈上closures的所有活动必须扩展BaseActivity