3

我有一个需要对 Dock 隐藏的 Java 应用程序,并且我还需要能够中断。这就是我处理关机的方式:

import com.apple.eawt.AppEvent.QuitEvent;
import com.apple.eawt.QuitHandler;
import com.apple.eawt.QuitResponse;
import com.apple.eawt.Application;

public class MacOSXCustomizer {
    public void init() {
        Application application = Application.getApplication();
        application.setQuitHandler(new QuitHandler() {
            public void handleQuitRequestWith(QuitEvent qe, QuitResponse qr) {
                if(Main.prepareForExit()) {
                    qr.performQuit();
                } else {
                    qr.cancelQuit();
                }
            }
        });
    }
}

我使用自己的 Java 启动器,并将应用程序包与我自己的 Java 启动器二进制文件一起使用。我将 LSUIElement 设置为 YES,这解决了我的 Dock 图标问题,但随后关闭挂钩停止工作。我的方法在关机期间被调用(我可以记录它),但即使调用 qr.cancelQuit() 也会终止应用程序。似乎系统没有等待响应。即使正在运行一些操作(2 秒长),它也没有完成。它会导致数据丢失。

我尝试将 LSUIElement 设置回 NO,然后在调用 qr.cancelQuit() 时系统取消关机。没有进行其他更改。

我还尝试创建仅实现一种方法的简单 Cocoa 应用程序:

- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
    return NSTerminateCancel;
}

它显示对话框“应用程序 ShutdownTest 取消注销”。但无论如何用户会话已注销。

我的问题是如何解决在 Dock 和菜单栏中没有图标并能够取消/中断关机序列的问题?

编辑:它是否是 Java 应用程序无关紧要。本机应用程序具有相同的行为。

4

1 回答 1

4

我与 Apple 技术支持讨论过,我要求的行为是不可能的。设计为代理的应用程序(例如通过将 LSUIElement 设置为 YES)不允许中断关机或注销序列。系统根本不等待响应,也不费心去阅读和尊重返回值。

后台应用程序(没有 Dock 图标和菜单栏)不允许与用户交互,也不允许取消他的关机序列。

Apple 技术支持表示无法隐藏 Dock 图标和菜单栏并成为前台应用程序。

于 2013-03-19T22:01:01.490 回答