从历史堆栈中删除一个活动
我的应用程序在用户第一次运行应用程序时显示注册活动,如下所示:
- ActivitySplashScreen(欢迎游戏,注册一个帐户?)
- ActivitySplashScreenSignUp(很好,填写这个信息)
- 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,检查链接 。