我制作了一个将数据保存到 .data 文件的 java 应用程序。我有一个窗口监听器,它监听应用程序关闭以触发代码将数据保存到文件中。当按下我拥有的专用退出按钮或按下窗口上的红色“X”时,一切都很好。但是,当用户选择 command + q route 时,事情就变糟了。应用程序已退出,但数据未保存。如何正确实现苹果的 handleQuit(Application Event e) 方法来解决这个问题?
1 回答
在这种情况下,您想要的是一个关闭挂钩。关闭挂钩侦听操作系统信号以关闭应用程序,并在发送此信号时触发。关闭挂钩几乎可以运行任何代码。
您可以连接内置的红色“X”按钮来关闭应用程序(而不是保存文件),关闭挂钩将捕获请求并负责保存文件。
唯一需要注意的是,关闭挂钩应该由执行时间不长的代码组成。因此,文件的保存时间不应超过一两秒,并且您不应使用用户必须在关闭挂钩中确认的确认对话框,因为在用户识别之前可能需要不确定的时间对话框。
关闭挂钩应该是短暂的原因是当应用程序被请求关闭时,操作系统通常希望它在合理的时间内关闭。如果没有,例如在 Windows 中,操作系统可能会显示其中之一,“应用程序没有响应......”消息。
最后,您以后可能会遇到这个问题,您可能想知道如何从任务管理器(或 OS X 上的“强制退出应用程序”对话框)捕获“强制退出”请求。好吧,你抓不到那些,你不应该尝试!虽然可以禁用诸如在 Force Quit 菜单中列出您的应用程序之类的功能,但这是一个完整的 hack,应该不惜一切代价避免。如果您在设计应用程序时试图绕过用户和管理员应该始终可用的选项,那么这强烈表明您的应用程序设计不佳和/或行为不佳。想象一下,如果你安装了一个以这种方式运行的应用程序——你会不会认为程序员在试图赋予他们的应用程序不可杀死的特性时是懒惰或可能是恶意的?
此外,强制退出是一种强制(不正常)关闭,只能在应用程序挂起且无法正常退出时使用。操作系统需要有一种强制退出选项,以便用户或管理员有办法杀死失控或无响应的应用程序。如果您的用户强制退出您的应用程序,他们要么误解了强制退出是不可取的,要么是您的应用程序的设计使强制退出比正常退出您的应用程序更有利。如果是这种情况(例如,您从用户那里听说他们出于某种原因强制退出),这通常表明您的应用程序的某些部分设计不佳,无法满足用户的期望。