如何清除背压事件的活动堆栈跟踪?

Posted

技术标签:

【中文标题】如何清除背压事件的活动堆栈跟踪?【英文标题】:How to clear activity stack trace on back press event? 【发布时间】:2013-05-22 02:12:51 【问题描述】:

我创建了一个具有多个页面的应用程序,从一个页面导航到另一个页面代表了一个关键流程。我不希望用户能够在没有事先警告他的情况下按下后退按钮并退出活动,然后最终删除所有堆栈跟踪,这样当活动再次启动时它会重新启动。

到目前为止,我一直在使用类似于以下功能的东西:

    @Override
    public void onBackPressed() 
    
        this.finish(); 
        Intent int1= new Intent(this, Home.class);
        int1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(int1);
        super.onBackPressed();
    

但有时在退出应用程序后,当我再次启动它时,它会从某个随机页面或我退出应用程序的页面重新启动(基本上不是预期启动的主屏幕)

除了清除代码中描述的所有以前的活动标志之外,我想不出更干净的方法来退出应用程序。 对上述任何帮助表示赞赏!

编辑:

在我的活动流程中,如果用户按下后退按钮,我希望将控件返回到主页(清除所有以前的活动堆栈跟踪)。这样,如果有人重新启动应用程序,它将从主页正常重新启动。

【问题讨论】:

这会帮助你***.com/questions/9937120/… 它类似于我发布的代码(它应该清除所有以前的活动堆栈跟踪但不会)。你建议的那个有用吗? 这个怎么样? ***.com/questions/8037869/… 【参考方案1】:

您不需要onBackPressed() 中的任何自定义代码。您需要做的就是将此添加到清单中的所有<activity> 定义中(根活动除外):

android:noHistory="true"

这可确保您的任何活动(除了根活动)都不会记录在后台堆栈中。当用户单击 BACK 键时,它将返回到根活动。

这样做的另一个好处是,如果用户离开您的应用程序(通过单击 HOME 或通过拉下通知栏并单击通知,当他返回到您的应用程序时,它也将返回到您的根活动。

【讨论】:

只是为了确定。这将仅在后按事件的情况下清除所有堆栈跟踪,对吗?不是因为它从一项活动向前引导到另一项活动吗? 没错。堆栈中的活动将保留在那里,直到用户按下 HOME 或 BACK 或您的活动之一调用 finish(),在这种情况下,所有 noHistory 活动将被销毁。 但是一旦你回到根活动,从根活动按回将再次显示根活动不是吗? @DavidWasser @KaushikS 不。为什么要这样做?只有当你的根活动在任务堆栈中两次时才会这样做! @DavidWasser 是的,对不起,我的错。我在我的代码中做了一件愚蠢的事情。【参考方案2】:

在我的活动流程中,如果用户按下后退,则任何时候 按钮,我希望控件被扔回主页 (清除所有以前的活动堆栈跟踪)。

这可以通过在所有活动前进时完成所有活动来完成,除了 MainActivity。

这样,如果有人重新启动应用程序,它将重新启动 通常来自主页。

如果用户在 Activity_5 并使用 Home Button 并重新启动应用程序,是否必须出现 MainActicity?

如果是这样,您可以在除 MainActivity 之外的每个 Activity 的 onPause() 中调用 finish()

编辑:

可能不是完美的解决方案,但这是我为实现完全相同而所做的(在我的应用程序中注销):

OnBackPressed() 在任何活动中更新 boolean 共享偏好backPressedtrue 并在所有活动的 onResume() 中,除了 MainActivity 检查其如果true,则值并完成。

@Override
protected void onResume() 
    super.onResume();

    SharedPreferences mSP = getSharedPreferences(
            "your_preferences", 0);
    if (mSP .getBoolean("backPressed", false)) 
        finish();
    

【讨论】:

没有。我只想在用户按下后退按钮时完成所有活动,而不是在我前进时完成。我基本上希望用户回到主屏幕并重新开始整个过程​​,以防他在交易过程中随时按下后退按钮。我现在面临的问题是我使用了上面发布的代码。但是在我退出应用程序并再次启动它之后。它会打开一些随机页面或我上次退出应用程序的页面。 嘿,这是一个有趣的解决方案,但对我来说有点偏离轨道。无论如何感谢您的努力! +1!【参考方案3】:

返回按钮用于返回上一个活动。所以我不会覆盖后退按钮来清除活动堆栈。我建议您为此使用操作栏。使用应用程序图标导航到应用程序的主屏幕。

http://developer.android.com/guide/topics/ui/actionbar.html

还可以通过warrenfaith查看此链接和答案下方的cmets

android - onBackPressed() not working for me

【讨论】:

我的应用程序基本上就像一个交易,相当于信用卡购买什么的,我不能让我的用户回去,这是一个必要的要求,它是否符合android规范。此外,当我按下后退按钮时,我正在谈论清除堆栈跟踪,因此在这个方向上的任何帮助都会有所帮助。 @GarimaTiwari 您是否检查了我在答案中发布的最后一个链接。但这是一个糟糕的设计。 我知道,我承认这可能是糟糕的设计,但我不能有任何其他方式。也是的,我确实阅读了您发布的链接,但它不是我要找的。​​span> @GarimaTiwari 在每个活动中,您都可以在您看到的链接中找到代码。当用户回按时,他将导航到主屏幕 这正是我正在使用的代码!但不知何故,在我退出我的应用程序并再次启动它之后,它会在我上次退出应用程序的同一页面重新启动,我看不出为什么会发生这种情况,因为这是清除任何先前堆栈跟踪的标准代码。 【参考方案4】:
@Override
public void onBackPressed() 

    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);

你可以使用那个代码,它对我有用!

【讨论】:

以上是关于如何清除背压事件的活动堆栈跟踪?的主要内容,如果未能解决你的问题,请参考以下文章

如何清除画布属性和事件并将其添加回fabricjs?

如何使用 ETW 编写自定义堆栈跟踪

node.js背压和排放事件。我遇到内存泄漏警告

Rxjava系列 RxJava2.0背压原理解析

如何在c#中跟踪windows事件

Android:清除活动堆栈