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

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

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

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

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

谢谢


当前回答

我用这种方法。

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

其他回答

是的,看看Intent.FLAG_ACTIVITY_NO_HISTORY。

太迟了,但希望能有所帮助。大多数答案都没有指向正确的方向。这种事情有两个简单的标志。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

来自Android文档:

公共静态最终int FLAG_ACTIVITY_CLEAR_TASK 在API级别11中添加 如果在传递给Context.startActivity()的Intent中设置了该标志,该标志将导致任何与Context.startActivity()关联的现有任务 在启动活动之前要清除的活动。也就是 Activity将成为空任务的新根,以及任何旧任务的根 活动结束。这只能与 FLAG_ACTIVITY_NEW_TASK。

在API 11之前工作的一种方法是首先启动ActivityGameMain,然后在该活动的onCreate中启动ActivitySplashScreen活动。ActivityGameMain不会在你太早调用startActivity时出现。

然后你可以在启动ActivityGameMain时通过在Intent上设置这些标志来清除堆栈:

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

您还必须将此添加到ActivitySplashScreen:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

按回那个活动不会回到你的ActivityGameMain。

我假设你不希望启动画面回到任何一个,为了实现这一点,我建议将它设置为noHistory在你的AndroidManifest.xml。然后将goBackPressed代码放在ActivitySplashScreenSignUp类中。

然而,我发现了一些方法来打破这个。从通知中启动另一个应用程序,同时ActivitySplashScreenSignUp显示,并且不重置回溯历史。

唯一真正解决这个问题的方法是在API 11中:

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

这可能不是理想的方法。如果有人有更好的办法,我会很期待去实施。以下是我如何使用11版本前的sdk完成这一特定任务。

在每节课上,你都想在时间清楚的时候离开,你需要这样做:

    ... interesting code stuff ...
    Intent i = new Intent(MyActivityThatNeedsToGo.this, NextActivity.class);
    startActivityForResult(i, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == R.string.unwind_stack_result_id) {
        this.setResult(R.string.unwind_stack_result_id);
        this.finish();
    }
}

然后,当你想要初始化它时,需要从堆栈中设置弹出链的函数需要调用this:

NextActivity.this.setResult(R.string.unwind_stack_result_id);
NextActivity.this.finish();

那么活动就不在堆栈上了! 请记住,你可以启动一个活动,然后开始清理它的背后,执行并不遵循一个单一的(ui)线程。

试试这个:

intent.addFlags (Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)

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