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

时间:2013-05-27 08:48:57

标签: android android-activity activity-lifecycle

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

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

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

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

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

编辑:

如果用户按下后退按钮,在我的活动流程中的任何时候,我都希望将控件返回到主页面(清除所有先前的活动堆栈跟踪)。这样,如果有人重新登录应用程序,它将从主页面重新开始。

4 个答案:

答案 0 :(得分:10)

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

android:noHistory="true"

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

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

答案 1 :(得分:1)

  

如果用户按下背部,我的活动流程中的任何时间   按钮,我希望控件被抛回主页面   (清除所有先前的活动堆栈跟踪)。

除了MainActivity之外,这可以通过完成所有活动来完成。

  

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

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

如果是这样,您可以在除MainActivity之外的每个活动的finish()中致电onPause()

修改

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

任何活动中的

OnBackPressed()都会更新boolean 共享偏好,将 backPressed 更改为trueonResume()所有活动,除了MainActivity检查其值并完成true

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

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

答案 2 :(得分:0)

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

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

另请查看warrenfaith

下方的回答和评论

android - onBackPressed() not working for me

答案 3 :(得分:0)

@Override
public void onBackPressed() 
{
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);
}

您可以使用该代码,它对我有用!