清除android活动堆栈并启动新活动。

4
我有一个应用程序,每个新创建的活动都会启动异步任务来验证用户会话。如果会话有效,则应用程序流程继续。如果无效,则必须清除整个活动堆栈,并且只剩下登录活动。此活动具有“无历史记录”标志,因此永远不会保留在堆栈中。
我一直在尝试一些提供的解决方案:Android: Clear Activity Stack,但没有成功。
这必须在最低的Android版本上运行,至少为2.2。
谢谢!
3个回答

3
我将我的登录活动保留在堆栈中。 在登录活动的onResume()方法中,我检查用户是否具有登录凭据,如果是,则调用下一个屏幕在登录后呈现的startActivity方法。在这种情况下,用户看不到登录屏幕。
当用户按下注销按钮时,我清除用户的凭据,然后将堆栈清除到登录屏幕。
    Intent intentLaunchLogin = new Intent(this, ActivityLogin.class);
    intentLaunchLogin.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intentLaunchLogin);

此外,如果用户在登录后看到的屏幕上按下“返回”按钮,我不希望他们进入登录活动。以下代码将把用户发送到主屏幕,与预期相符:
moveTaskToBack(true);

我来试试 ;) 只是有一个疑问,moveTaskToBack函数必须放在除登录页面之外的所有活动中还是只放在登录页面中? - Miguel Ribeiro
它起作用了,但是我在登录后对活动进行了轻微的更改。我劫持了返回按钮操作,将其移动到后台并完成活动。我希望每次应用程序恢复时都从登录活动开始。 - Miguel Ribeiro
1
我只在登录后的Activity的onBackPressed处理程序中使用了moveTaskToBack调用,因为我不希望用户再次看到登录屏幕。只有当用户注销时,我才希望登录屏幕出现。 - Andrew

0

这是我经常做的事情,而且完美运作。 我使用主活动启动应用程序,并检查用户是否已登录,如果未登录,则启动登录活动,如下所示

void launchLoginActivity(){
 /* Move user to LoginActivity, and remove the backstack */
    Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(intent);
    finish();
}

它不会允许你返回


0

不,我不想重新启动应用程序,我认为这不会是一个良好的用户体验。 - Miguel Ribeiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接