Android(清除活动堆栈)

亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述Android:清除活动堆栈相关的知识,希望能为你提供帮助。
我在我的应用程序中有几个活动。并且流程非常复杂。当我点击Logout应用程序naviagates登录屏幕时,用户可以通过取消按钮退出(调用system.exit(0)
当我退出或返回按钮时,系统从堆栈调用一个活动:(当我到达登录界面时,如何清除堆栈中的所有活动?调用finish()是不实际的,因为有这么多的活动,一些活动不应该关闭时它们是活动的,例如本机相机调用活动。

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);

答案大多数人都错了。如果要关闭现有的活动堆栈而不管其中的内容是什么并创建新的根,则正确的标志集如下:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

【Android(清除活动堆栈)】From the doc:
public static final int FLAG_ACTIVITY_CLEAR_TASK 在API级别11中添加
如果在传递给Context.startActivity()的Intent中设置,则此标志将导致在活动开始之前清除与活动关联的任何现有任务。也就是说,活动成为否则为空任务的新根,并且任何旧活动都已完成。这只能与FLAG_ACTIVITY_NEW_TASK一起使用。
另一答案当您在最后一个活动上调用startActivity时,您可以随时使用
Intent.FLAG_ACTIVITY_CLEAR_TOP
作为该意图的旗帜。
阅读更多关于国旗here。
另一答案这是一个简单的辅助方法,用于启动新活动,作为从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也被关闭了。结果是,
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();

另一答案这个决定很好:
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(); } }

缺点:必须在堆栈上关闭的所有活动必须扩展BaseActivity
另一答案我注意到你要求的解决方案不依赖于finish(),但我想知道这是否有帮助。
我跟踪是否使用静态类变量引发退出标志,该变量在整个应用程序生命周期中存活。在每个相关活动的onResume()中,使用
@Override public void onResume() { super.onResume(); if (ExitHelper.isExitFlagRaised) { this.finish(); } }

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

让我们说在mainActivity中,用户按下一个按钮退出 - 你可以设置ExitHelper.isExitFlagRaised = true; 然后finish()。此后,还将完成自动恢复的其他相关活动。
另一答案对于Xamarin开发人员,您可以使用:
intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);


    推荐阅读