实现以下目标的标准方法是什么?
下图是不言自明的
在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
+---------------------------------------+
答案 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仅包含您打算进行的活动的好方法。