当前位置:  开发笔记 > 编程语言 > 正文

从历史堆栈中删除活动

如何解决《从历史堆栈中删除活动》经验,为你挑选了9个好方法。

我的应用在用户首次运行应用时显示了注册活动,如下所示:

    ActivitySplashScreen(欢迎来到游戏,注册一个帐户?)

    ActivitySplashScreenSignUp(很棒,请填写此信息)

    ActivityGameMain(主游戏画面)

因此,当用户点击每个屏幕上的按钮时,活动将以完全相同的顺序相互启动.

当用户从活动#2转到#3时,是否可以完全从历史堆栈中删除#1和#2?我喜欢它,以便如果用户在#3,并点击后退按钮,他们只是转到主屏幕,而不是回到启动画面.

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

谢谢



1> Aitor Gómez..:

您可以通过在文件的相关条目中设置android:noHistory属性来实现此目的.例如:"true"AndroidManifest.xml



我怎样才能从代码中实现这一目标?因为我不想一直这样做.我想仅在某些条件下从历史中删除给定的活动.
等效地,您可以使用`FLAG_ACTIVITY_NO_HISTORY`.
复制所需的标志很困难,因为它是一个链接,所以这里可以轻松复制.`机器人:noHistory = "真"`
这是最好的方法.
请注意,使用noHistory属性会使该活动完成,例如,可能会导致G +登录时出现意外行为.请参阅:/sf/ask/17360801/花了一些时间才发现此错误我的应用程序一直没有任何痕迹崩溃.
使用这个,如果你按下主页按钮并再次启动应用程序,而不是恢复活动,它将完成活动!
一个问题.在新版本的Android M中,当您调用requestPermissions时,您的活动将消失.这是个大问题 ;)

2> Dan Lew..:

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


马克,要实现你想要的,你必须使用标志:FLAG_ACTIVITY_CLEAR_TOP.我希望它有所帮助.
`FLAG_ACTIVITY_CLEAR_TOP`不起作用,因为C不在后栈中.

3> Matthias..:

是的,看一下Intent.FLAG_ACTIVITY_NO_HISTORY.


请注意,这不会为您要启动的活动设置历史记录.要没有你正在启动的活动的历史记录,我只需在清单中设置它为`android:noHistory ="true"`.

4> Travis..:

这可能不是理想的做法.如果某人有更好的方法,我将期待实施它.以下是使用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)线程.



5> mxcl..:

在API 11之前工作的一种方法是首先启动ActivityGameMain,然后在该onCreateActivity中启动您的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);



6> 小智..:

我用这种方式.

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



7> 小智..:

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



8> 小智..:

只需noHistory="true"Manifest文件中设置即可.它使活动从后台堆栈中删除.



9> Anubhav..:

在清单中,您可以添加:

android:noHistory="true"


你也可以打电话

finish()

调用startActivity(..)后立即


使用活动标志比将内容放入清单更好。
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有