从历史堆栈中删除一个活动

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

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

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

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

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

谢谢

231322 次浏览

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

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

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

这可能不是理想的方法。如果有人有更好的办法,我会很期待去实施。下面是如何使用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();

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

我知道我有点晚了(这个问题已经问了两年了),但我通过拦截后退按钮来实现这一点。而不是检查具体的活动,我只是看看计数,如果它小于3,它只是简单地将应用程序发送到后面(暂停应用程序,并返回用户在启动之前正在运行的任何东西)。我检查少于三个,因为我只有一个介绍屏幕。此外,我还检查了计数,因为我的应用程序允许用户通过菜单导航回主屏幕,这样如果堆栈上除了介绍屏幕之外还有其他活动,他们就可以通过正常的其他屏幕进行备份。

//We want the home screen to behave like the bottom of the activity stack so we do not return to the initial screen
//unless the application has been killed. Users can toggle the session mode with a menu item at all other times.
@Override
public void onBackPressed() {
//Check the activity stack and see if it's more than two deep (initial screen and home screen)
//If it's more than two deep, then let the app proccess the press
ActivityManager am = (ActivityManager)this.getSystemService(Activity.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = am.getRunningTasks(3); //3 because we have to give it something. This is an arbitrary number
int activityCount = tasks.get(0).numActivities;


if (activityCount < 3)
{
moveTaskToBack(true);
}
else
{
super.onBackPressed();
}
}

在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);

试试这个:

intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)

它是API级别1,检查链接

我用这种方法。

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

清单文件中设置noHistory="true"

在清单中,您可以添加:

android:noHistory="true"


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

你也可以打电话

finish()

在调用startActivity(..)

只需在startActivity(intent)之前调用this.finish(),就像这样-

       Intent intent = new Intent(ActivityOne.this, ActivityTwo.class);
this.finish();
startActivity(intent);

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

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);作为中介Activity。一旦中间链接断开,DashActivity将位于堆栈的第一个和最后一个。

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

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

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

来自Android文档:

public static final int FLAG_ACTIVITY_CLEAR_TASK API级别11

If set in an Intent passed to Context.startActivity(), this flag will cause any existing task that would be associated with the

activity在activity开始之前被清除。也就是 Activity将成为空任务的新根,以及任何旧任务的根 活动结束。这只能与 FLAG_ACTIVITY_NEW_TASK . < / p >

从历史记录中删除一个活动是通过在你不想要的活动之前设置标志来完成的

A - C > B - > - > D

如果你想清除B和C,那么假设A,B,C和D是4个活动 设置标记< / p >
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

在活动A和B中

这是代码位

Intent intent = new Intent(this,Activity_B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
super.finishAndRemoveTask();
}
else {
super.finish();
}

在这里我列出了一些完成这个任务的方法:

  1. 进入manifest.xml-并输入android:noHistory="true",以从堆栈中删除活动。

  2. 当从当前活动切换到其他活动时,在意图设置标志为(意图。Intent.FLAG_ACTIVITY_CLEAR_TASK)。下面的示例演示了这一点。

    Intent = new Intent(CurrentActivity. CurrentActivity.)这一点,HomeActivity.class); intent.setFlags(意图。FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK) startActivity(意图);这里< / p >

请注意:放置意图标志会导致黑屏一段时间(当切换活动时)。