首页 文章

Android:清除活动堆栈

提问于
浏览
96

我在我的应用程序中有几个活动 . 并且流程非常复杂 . 当我单击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);

9 回答

  • 1

    对于Xamarin开发人员,您可以使用:

    intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);
    
  • 4

    大多数人都错了 . 如果要关闭现有的活动堆栈而不管其中的内容是什么并创建新的root,则正确的标志集如下:

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

    From the doc

    public static final int FLAG_ACTIVITY_CLEAR_TASK在API级别11中添加如果在传递给Context.startActivity()的Intent中设置,则此标志将导致在活动开始之前清除与活动关联的任何现有任务 . 也就是说,活动成为否则为空任务的新根,并且任何旧活动都已完成 . 这只能与FLAG_ACTIVITY_NEW_TASK一起使用 .

  • 28

    当您在上次活动中调用 startActivity 时,您可以随时使用

    Intent.FLAG_ACTIVITY_CLEAR_TOP

    作为该意图的旗帜 .

    阅读更多关于国旗here的信息 .

  • 2

    这是一个简单的辅助方法,用于启动新活动,作为从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);
    
  • 16

    就我而言,LoginActivity也被关闭了 . 结果是,

    Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK
    

    没有帮助 .

    但是,设定

    Intent.FLAG_ACTIVITY_NEW_TASK
    

    帮助过我 .

  • 2

    Clear Activity Backstate 由以下代码:

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

    Done

  • 4
    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();
    
  • 3

    我注意到你要求的解决方案不依赖于 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() . 此后,还将完成自动恢复的其他相关活动 .

  • 270

    这个决定很好:

    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

相关问题