如何使用Apple的handleQuit方法?

2024-04-13

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


在这种情况下你想要的是关闭钩子 http://www.developerfeed.com/threads/tutorial/understanding-java-shutdown-hook。关闭钩子监听操作系统信号以关闭应用程序,并在发送此信号时触发。关闭挂钩几乎可以运行任何代码。

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

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

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

最后,您稍后可能会遇到这个问题,您可能想知道如何从任务管理器(或 OS X 上的“强制退出应用程序”对话框)捕获“强制退出”请求。好吧,你无法抓住这些,而且你不应该尝试!尽管可以禁用诸如在“强制退出”菜单中列出您的应用程序之类的功能 https://stackoverflow.com/questions/3145677/java-disable-osx-force-quit,这是一个彻底的黑客行为,应该不惜一切代价避免。如果您设计应用程序的方式试图规避用户和管理员应始终可用的选项,那么这强烈表明您的应用程序设计不佳和/或行为不佳。想象一下,如果您安装了一个以这种方式运行的应用程序 - 您是否会认为程序员在试图赋予他们的应用程序不可杀死的品质方面是懒惰或可能是恶意的?

此外,强制退出是一种强制(不正常)关闭,仅应在应用程序挂起且无法正常退出时使用。操作系统需要有一种强制退出的选项,以便用户或管理员有办法杀死失控或无响应的应用程序。如果您的用户强制退出您的应用程序,他们要么会误解强制退出是不可取的,要么您的应用程序的设计中存在某些问题,使得强制退出比正常退出您的应用程序更有利。如果是这种情况(例如,您从用户那里听说他们出于某种原因强制退出),通常表明您的应用程序的一部分设计不佳,无法满足用户的期望。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Apple的handleQuit方法? 的相关文章

  • Swift 中带圆角的 NSWindow

    我想要一个圆角的窗户 但我在每个角落都有一个白点 Code let effect NSVisualEffectView frame NSRect x 0 y 0 width 0 height 0 effect blendingMode be
  • 未找到 MessageSource 的 ResourceBundle [消息]:找不到基本名称消息的包

    在 applicationContext xml 中 我定义了 MessageSource 如下所示
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • 使用cameltestsupport进行Camel单元测试,模板始终为空

    我正在用 Camel 做一个简单的单元测试 我想做的就是从文件 在资源下 读取 JSON 内容 将其发送到 Java 类进行验证 这是我试图测试的路线 无论我做什么 模板 我用来发送正文 json 始终为空 这是我的代码 public cl
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 如何让spring为JdbcMetadataStore创建相应的schema?

    我想使用此处描述的 jdbc 元数据存储 https docs spring io spring integration docs 5 2 0 BUILD SNAPSHOT reference html jdbc html jdbc met
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • 启动Java项目时发生类冲突:ClassMetadataReadingVisitor将接口org.springframework.asm.ClassVisitor作为超类

    我正在使用最新的Spring框架版本 3 2 2 RELEASE 开发一个Java Web项目 但是现在项目启动时遇到了问题 详细错误是 java lang IncompleteClassChangeError 类 org springfr

随机推荐