7

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

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

    @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

4 回答 4

14

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

android:noHistory="true"

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

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

于 2013-05-27T18:23:02.480 回答
1

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

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

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

如果用户在 Activity_5 并使用主页按钮并再次重新启动应用程序,是否必须出现 MainActicity?

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

编辑:

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

OnBackPressed()在任何活动更新中,共享boolean 首选项backPressed和所有活动,除了 MainActivity 检查它的值并完成 if 。trueonResume()true

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

    SharedPreferences mSP = getSharedPreferences(
            "your_preferences", 0);
    if (mSP .getBoolean("backPressed", false)) {
        finish();
    }
}
于 2013-05-27T09:33:58.220 回答
0

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

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

还要检查这个链接和warrenfaith的答案下方的评论

android - onBackPressed() 对我不起作用

于 2013-05-27T08:56:31.790 回答
0
@Override
public void onBackPressed() 
{
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);
}

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

于 2020-07-16T02:15:55.723 回答