我的应用程序显示注册活动的第一次用户运行应用程序,看起来像:

ActivitySplashScreen(欢迎加入游戏,注册账号吗?) ActivitySplashScreenSignUp(很好,填写这个信息) ActivityGameMain(游戏主界面)

因此,当用户单击每个屏幕上的按钮时,这些活动以相同的顺序相互启动。

当用户从活动#2到#3时,是否有可能将#1和#2从历史堆栈中完全擦除?我希望这样,如果用户处于#3,并点击返回按钮,他们只会回到主屏幕,而不是回到启动画面。

我想我可以完成任务。开始第三项任务,但想看看是否有更简单的方法,

谢谢


当前回答

您可以使用转发从活动堆栈中删除前一个活动,同时启动下一个活动。APIDemos中有一个这样的例子,但基本上你所做的只是在调用startActivity()之后立即调用finish()。

其他回答

你可以通过在AndroidManifest.xml文件中的相关<activity>条目中将android:noHistory属性设置为“true”来实现这一点。例如:

<activity
    android:name=".AnyActivity"
    android:noHistory="true" />

试试这个:

intent.addFlags (Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)

它是API级别1,检查链接。

居然没有人提到这个优雅的解决方案,真是不可思议。这应该是公认的答案。

SplashActivity -> AuthActivity -> DashActivity

if (!sessionManager.isLoggedIn()) {
    Intent intent = new Intent(context, AuthActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    context.startActivity(intent);
    finish();
} else {
   Intent intent = new Intent(context, DashActivity.class);
   context.startActivity(intent);
    finish();
}

这里的关键是使用intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);为中介活动。一旦中间的链接断开,DashActivity将位于堆栈的第一个和最后一个。

android:noHistory="true"是一个糟糕的解决方案,因为它会在依赖Activity作为回调时引起问题,例如onActivityResult。这是推荐的解决方案,应该被接受。

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            super.finishAndRemoveTask();
        }
        else {
            super.finish();
        }

我用这种方法。

Intent i = new Intent(MyOldActivity.this, MyNewActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);