Android应用程序中的Backstack和标准登录实践

时间:2015-01-21 18:05:31

标签: android android-intent android-activity back-stack

实现以下目标的标准方法是什么?

下图是不言自明的

在SplashActivity中,我检查是否有用户使用数据库登录,如果有,请获取详细信息并直接进入MainActivity

if (App.getAccountData().isSomeoneSignedIn()) {
    // then skip everything and go to Home Screen, dont need to send any user info, home screen picks up directly from appData
    Log.i("XXX", "Found an User, email = " + App.getAccountData().getEmail() + " .Going straight to home");
    Intent intent = new Intent(this, MainActivity_.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
    finish();
}

当我离开Splash时 - >登录时,我想将Splash放在后台,但是,当我从Signin - > Main时,我想删除所有内容并将Main保留在堆栈中,以便按下后退按钮将用户带到Android Home。

类似地,在注册流程中,我想将后台堆栈保留到ExtraInfo2,但是在ExtraInfo2 - > Main中,我想删除整个后台堆栈,以便按“后退”按钮将用户(已登录)带到Android Home。

我怎样才能做到这一点?

    +----------SplashActivity-----+                                     
    |                             |                                     
    |  Sign In            Sign Up <----------------------+              
    |   +                         |                      |              
    +---------------------------+-+                      |              
        |                       |                        |              
        |                       |                        |              
        |                +------+------------+           |              
   +----+-----+          |                   |           |              
   |          |          | RegisterEmailPwdActivity      |              
   | Get email, pwd      |                   |           |              
   |          |          |                   |Back does usual           
   | SignInActivity      |                   |           |              
   |          |          |                   |           |              
   |          |          +-----+-------------+           |              
   |          |                |                         |              
   |          |           +----v----------+---+          |              
   +--+-------+           | ExtraInfo1Activity|          |              
      |                   |                   | Back does usual         
      |                   |                   |          |              
      |                   |                   |          |              
      |                   +----+--------------+          |              
      |                        |                         |              
      |                   +----v----------+---+          |              
      |                   | ExtraInfo2Activity|Back disabled            
      |                   |                   |          |              
      |                   +----+--------------+          |              
      |                        |                         |              
Should clear full stack here   |                         |              
   +---------------------------v-----------+             |              
   |                                       |             |              
   |                                       |             |              
   |              Main Activity        Logout------------+              
   |          Back should minimize         |      Logout takes to splash
   +---------------------------------------+                            

1 个答案:

答案 0 :(得分:2)

  

当我离开Splash时 - &gt;登录时,我想将Splash放在后台,但是,当我从Signin - &gt; Main时,我想删除所有内容并将Main保留在堆栈中,以便按下后退按钮将用户带到Android Home。

当您从SignInActivity转换为MainActivity时,您可以设置意图标记以实现所需的结果。以下是设置FLAG_ACTIVITY_CLEAR_TASK和FLAG_ACTIVITY_NEW_TASK的示例方法。

    private void startMainActivity() {
       Intent intent = new Intent(mContext, MainActivity.class);
       intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
       startActivity(intent);
    }
  

类似地,在注册流程中,我想将后台堆栈保留到ExtraInfo2,但是在ExtraInfo2 - &gt; Main中,我想删除整个后台堆栈,以便按“后退”按钮将用户(已登录)带到Android Home。

这将以类似的方式工作。从ExtraInfoActivity1转换到ExtraInfoActivity2时,请设置上面示例中设置的标志。

从ExtraInfoActivity2转换到MainActivity时执行相同操作。然后,当从MainActivity按下后退时,用户将被带到主屏幕。

另一个提示是使用adb shell的一个功能来检查当前在Backstack中的哪些活动(并且您可以看到它们所处的任务)。为此,请将设备连接到计算机,运行应用程序,打开终端然后进入adb shell并运行命令 dumpsys activity 。将生成大量文本,但其中一些将如下所示:

  Stack #1:
Task id #193
  TaskRecord{432f8570 #193 A=com.activitybackstacktester U=0 sz=1}
  Intent { flg=0x10008000 cmp=com.activitybackstacktester/.MainActivity }
    Hist #0: ActivityRecord{42f2a090 u0 com.activitybackstacktester/.MainActivity t193}
      Intent { flg=0x10008000 cmp=com.activitybackstacktester/.MainActivity }
      ProcessRecord{431267b8 32667:com.activitybackstacktester/u0a156}
Running activities (most recent first):
  TaskRecord{432f8570 #193 A=com.activitybackstacktester U=0 sz=1}
    Run #0: ActivityRecord{42f2a090 u0 com.activitybackstacktester/.MainActivity t193}

此输出告诉您在任务堆栈#1中,堆栈上有一个活动,其名称为MainActivity。如果在SignInActivity位于前台时运行此命令,您应该看到该任务在堆栈中具有LoginActivity和SignInActivity。这是验证backstack仅包含您打算进行的活动的好方法。