尝试在我的Android应用程序中实现退出确认

3
我已经发现在Android手机上无法覆盖Home按钮。它会退出应用程序,它总是退出应用程序,而且不会提供任何形式的确认。我想我理解Google的原因,但我认为这有点短视...
无论如何,在了解Home按钮之前,我设置了我的应用程序,以便用户可以通过选项菜单退出应用程序 - 使用onCreateOptionsMenu()和XML文件,我设置了一个简单的弹出菜单,当按下菜单按钮时显示。其中之一是Exit,它很好地工作。
然而,我想到可能将确认对话框添加到退出过程中是一个好习惯(即使它也可以被认为是多余的)。所以,我创建了一个AlertDialog,标题为“您要退出吗?”以及Yes和No按钮...
按钮的单击监听器很简单,只需将exitConfirm(一个布尔值)设置为true或false。处理Exit菜单选择的代码然后清理我的应用程序并根据exitConfirm的状态执行finish()或不执行...
不幸的是,它完全不起作用...退出情况下的所有代码都会执行,然后才显示对话框!!我想我应该已经看到了这一点。我想如果我继续努力,我会想出一种方法来实现这一点,但我想问问社区是否有建议 - 那么,有人有建议以平稳的方式退出Android应用程序,其中包括从用户那里获得确认的步骤吗?
谢谢, R.

2
它退出了应用程序 - HOME并不会立即“退出”任何东西,就像在Windows中最小化窗口一样,“退出”任何东西一样。而且它不会打扰任何软弱无力的确认 - 如果您的活动在前台,则会调用onPause()onStop(),就像在其他情况下屏幕被另一个活动接管时一样。请记住,当用户接听电话,回复短信,闹钟响起等情况发生时,也会发生这种情况。 - CommonsWare
3个回答

6
首先,这是一种可怕的做法。询问确认可能是桌面应用程序的不错选择,但你正在编写移动应用程序。它是不同的。实际上,我需要用粗体写出来: 你不是在编写桌面应用程序。 我建议:没有启动屏幕。没有退出选项。绝对没有退出确认。这里是一个关于此的优秀问题
对于你的问题:使用setPositiveButton和setNegativeButton来处理按钮。

桌面应用程序并没有特殊之处,说明只有它们应该优雅地关闭。我的应用程序做了一些类似桌面应用程序的事情:它通过TCP通过Wifi通信,并需要在正确的时间断开连接-而不是在错误的时间断开。它接受用户输入并相应地更改正在进行的操作等。我知道我不是在制作普通的Android应用程序,但我并不认为这是我的问题。最终答案无疑是“就是这样,你要对付它”,我明白。但我认为这并不是做事情的最佳方式。 - Rich
这是一个自以为是且没有帮助性的回答。有很多情况是合理的,如果你没有退出确认,那么你就太傻了。 - Cerin
1
@Cerin 这不是一种自以为是、无益的回答。这是一个正确的回答。我认为你误解了他的语气……他根本没有自以为是,他只是说了实话。你的Android应用程序中不应该有退出按钮。 - Alex Lockwood
你开发了一个儿童应用程序,但是在玩耍时,孩子们不小心按了返回按钮!那么,作为一种预防措施,你需要考虑这个问题。 - sai

4

简短回答:

建议您阅读:Android应用程序何时包含退出按钮

详细回答:

你可以尝试类似于这样的方法:

protected Dialog onCreateDialog(int id) {
        Dialog dialog = null;

        switch (id) {
        case MENU_QUIT:
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage(getString(R.string.main_screen_quit_text))
                    .setCancelable(false)
                    .setPositiveButton(
                            getString(R.string.main_screen_quit_yes),
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {

                                    moveTaskToBack(true);
                                }
                            })
                    .setNegativeButton(getString(R.string.main_screen_quit_no),
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    dialog.cancel();
                                }
                            });
            AlertDialog alert = builder.create();
            return alert;
        default:
            dialog = null;
        }
        return dialog;
    }

2
显然,在Android应用程序中加入退出按钮(或菜单项等)通常被认为不太酷。这是因为你的应用程序并没有真正退出,而只是被最小化到一边,预计操作系统最终会处理它。
但是,如果你所做的事情需要在完成后进行一些清理工作,那么我认为以下内容很重要:
1. 仔细注意各种Android“生命周期方法”,特别是它们的触发条件。生命周期方法包括onCreate()、onStart()、onResume()、onPause()和onStop()。还有一个与onCreate()相对应的方法onDestroy(),但我目前没有使用它。
2. 这些方法是响应各种事件调用的(如按下Home键),但在我的情况下,重要的是最小化应用程序会调用onPause(),最大化会调用onResume()。因此,我需要从这些位置调用我的设置和拆卸方法,而不是从onCreate()和onDestroy()等位置调用。
3. 有一个叫做finish()的函数曾经在我的代码中随处可见。现在它只出现在处理与我的外部设备失去联系的方法中。我认为调用finish()的结果与按下Home键的结果完全相同,因此它只是一种在软件中“按下”Home键的方式。
总之,Home键绝对会隐藏用户的应用程序。你无法捕获此按键——无论你多么想添加某种“确定吗?”功能。然而,应用程序被最小化了,而不是关闭了,这可能是好事也可能是坏事。如果你已经正确地编写了启动和关闭代码(并将其添加到适当的生命周期方法中),那么你就不会破坏任何东西,你的用户将能够轻松地返回你的应用程序,一旦他们学会长按Home键以查看最小化的应用程序列表。
希望运气好的话,他们会把他们的沮丧归咎于Google,而不是你...

当然,你可以随意对那些不同意你观点的人进行负面评价,但你仍然没有理解桌面应用和移动应用之间的区别。你的应用程序随时可以被隐藏,就像来电一样。那么你想要确认对话框吗?手机用户经常在应用程序之间切换,由于没有虚拟内存,后台应用程序可能会在没有警告的情况下被终止。你应该阅读其他答案中提供的一些链接。如果你有一个打开的TCP连接,你可以提供一个关闭选项,但不能杀死应用程序本身。 - EboMike
难道这不是downvoting的作用吗?我已经多次阅读了所有链接,而你所坚持的桌面应用程序和移动应用程序之间的差异并不大。至于来电,当然我希望有一个确认对话框,因为那就是我想要的。正如你所引用的,“后台应用程序可以随时被杀死。”人们会认为这是基于资源的决定,但在我看来,这使得避免意外最小化变得更加重要,而不是更少。 - Rich
2
finish() 不同于 HOME,它的作用类似于 BACK。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接