如何使用Apple的handleQuit方法?

时间:2012-09-08 17:08:10

标签: java macos

我创建了一个将数据保存到.data文件的java应用程序。我有一个Window Listener,它监听要关闭的应用程序,以便触发代码将数据保存到文件中。按下我有的专用退出按钮,或按下窗口上的红色“X”,一切都很好。但是,当用户选择命令+ q路由时,事情会变得糟糕。应用程序退出,但数据未保存。如何正确实现apple的handleQuit(Application Event e)方法来解决这个问题?

1 个答案:

答案 0 :(得分:4)

在这种情况下,您想要的是shutdown hook。关闭挂钩侦听OS信号以关闭应用程序,并在发送此信号时触发。关闭钩子几乎可以运行任何代码。

您可以连接内置红色“X”按钮以关闭应用程序(而不是保存文件),并且关闭挂钩将捕获请求并负责保存文件。

唯一需要注意的是,关闭钩子应该由不需要很长时间执行的代码组成。因此,保存文件的时间不应超过一两秒,并且不应使用用户必须在关闭挂钩中确认的确认对话框,因为在用户识别之前可能需要无限期的时间对话框。

关闭挂钩应该短暂的原因是当请求关闭应用程序时,操作系统通常希望它在合理的时间内关闭。如果没有,例如在Windows中,操作系统可能会显示其中一个“应用程序没有响应...”消息。

最后,您可能会在以后遇到这个问题,您可能想知道如何从任务管理器(或OS X上的“强制退出应用程序”对话框)中捕获“强制退出”请求。好吧,你不能抓住那些,你不应该尝试!虽然it is possible to disable things like listing your app in the Force Quit menu,这是一个完整的黑客,应该不惜一切代价避免。如果您设计的应用程序试图绕过应该始终可供用户和管理员使用的选项,那么这表明您的应用程序设计糟糕,和/或行为不好。想象一下,如果你安装了一个以这种方式运行的应用程序 - 难道你不认为程序员在试图让他们的应用程序具有不可杀戮的品质时是懒惰还是可能是恶意的?

此外,强制退出是强制(非正常)关闭,只应在应用程序挂起时使用,并且不会正常退出。操作系统需要有一个强制退出选项,以便用户或管理员有办法杀死失控或无响应的应用程序。如果您的用户强行退出您的应用,他们或者误解了强制戒烟是不可取的,或者您的应用程序的设计使得强制戒烟比正常退出您的应用程序更有利。如果是这种情况(例如,您听到用户因为某种原因而强行退出),则通常表明您的应用部分设计不合理,无法满足用户的期望。