【问题标题】:Clearing android stack before starting a new activity在开始新活动之前清除 android 堆栈
【发布时间】:2015-05-13 10:08:40
【问题描述】:

我有一个包含三个活动的应用程序:登录、注册和主活动。

我想在用户登录或注册后启动主要活动。 但是,当用户按下“后退”按钮时,他不应该看到他登录的活动。换句话说,我想在启动 Main 活动之前清除活动堆栈。

我在网上看到了一些解决方案,例如:thisthisthis。 他们没有帮助。

这是我从登录活动启动主要活动的代码:

Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
getApplicationContext().startActivity(intent);

注册活动中的代码非常相似。

我也试过把finish();在我开始活动之后,但它只关闭了当前活动。意思是,如果我从登录活动开始,移动到注册活动并在那里登录(登录->注册->主),当我按下“返回”按钮时,我将返回登录活动。

感谢您的帮助! 尤瓦尔。

【问题讨论】:

    标签: android android-intent android-activity


    【解决方案1】:

    简单的方法是在清单中使用“noHistory”属性。您可以在清单文件中为登录活动设置它

    <activity
        android:noHistory="true"
    />
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      如果用户进入注册屏幕,则只需完成登录活动,当他们单击设备上的后退按钮时,您可以调用 onBackPressed () 方法。在那里,您可以完成注册屏幕并开始登录活动。如果用户进入注册屏幕然后注册,您还希望完成注册活动并打开主菜单或其他内容。

      登录:

      点击注册?开始注册活动并完成登录

      startActivity (new Intent (Login.this, Register.class));
      finish ();
      

      注册:

      点击提交?开始主要活动并完成注册活动

      startActivity (new Intent (Register.this, Main.class));
      finish ();
      

      点击后退按钮?

      @Override
      public void onBackPressed (){
      startActivity (new Intent (Register.this, Login.class));
      finish ();
      

      }

      你也可以在androidmanifest中使用:

      android:noHistory="true"
      

      在您希望没有历史记录的活动中(如果用户单击后退按钮则无法进入该活动)。 但我更喜欢用代码来做!

      希望对您有所帮助!

      【讨论】:

      • 我想过这样做,但我希望会有一种“更清洁”的方式。如果我找不到其他方法,我会这样做。
      【解决方案3】:

      试试这个:

      Intent intent = new Intent(this, SomeOtherClass.class);
      
      // do not keep this intent in history
      intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
      startActivity(intent);
      

      【讨论】:

      • 这不会将 SomeOtherClass 活动添加到堆栈中,但不会擦除堆栈的内容。
      • 我的想法是不要将以前的活动添加到堆栈中。
      【解决方案4】:

      您所做的几乎是正确的,只需在 Intent 中做一点小改动。

      代替使用,

          Intent intent = new Intent(LoginActivity.this, MainActivity.class);
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
          getApplicationContext().startActivity(intent);
      

      使用:

          Intent intent = new Intent(LoginActivity.this, MainActivity.class);
          intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
          getApplicationContext().startActivity(intent);
      

      它将清除顶部,开始一个新任务并清除所有以前的任务。现在,Android 只知道堆栈中存在一个 MainActivity。你可以写:

          @Override
          public void onBackPressed() {
               finish();
          }
      

      在 MainActivity 中,这将允许用户退出应用程序而不返回到 LoginActivity。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        • 2011-10-27
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 2012-09-19
        • 1970-01-01
        相关资源
        最近更新 更多