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

我的应用程序在用户第一次运行应用程序时显示注册活动,如下所示:

  1. ActivitySplashScreen(欢迎游戏,注册一个帐户?)
  2. ActivitySplashScreenSignUp(很好,填写这个信息)
  3. ActivityGameMain(主游戏画面)

所以当用户点击每个屏幕上的一个按钮时,这些活动正好按照这个顺序启动。

当用户从活动#2转到#3时,是否可以完全清除历史堆栈中的#1和#2? 我喜欢这样,如果用户在#3,并点击后退按钮,他们只是去主屏幕,而不是回到初始屏幕。

我想我可以用任务来完成这个任务(即在#3开始一个新的任务),但想看看是否有更简单的方法,

谢谢

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

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

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

是的,看看Intent.FLAG_ACTIVITY_NO_HISTORY 。

这可能不是理想的方式。 如果有人有更好的办法,我会期待实施。 以下是用pre-version-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(); } } 

那么需要从堆栈中引出弹出链的那个需要在你想启动的时候调用它:

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

那么这些活动不在堆叠上!
记住人们,你可以开始一个活动,然后开始清理它,执行不会跟随一个单独的(ui)线程。

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

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

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

您还必须将此添加到ActivitySplashScreen中:

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

所以按下这个活动不会回到你的ActivityGameMain

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

不过,我发现了一些方法来打破这一点。 在显示ActivitySplashScreenSignUp同时从通知中启动另一个应用程序,并且不重置后台历史记录。

唯一真正的解决方法是在API 11中:

 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 

我用这种方式

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

我知道我迟到了(这个问题已经过了两年了),但我是通过拦截后退按钮来完成的。 而不是检查具体的活动,我只是看看计数,如果它小于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(); } } 

清单文件中设置noHistory="true" 。 它使得活动从后台删除。

对于API> = 15到API 23其他解决方案不适用于我的情况。 最后我得到这个。

  Intent nextScreen = new Intent(currentActivity.this, MainActivity.class); nextScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); startActivity(nextScreen); ActivityCompat.finishAffinity(currentActivity.this); 

在清单中,您可以添加:

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

尝试这个:

intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)

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