【问题标题】:if java app is close , but not close by the frame如果 java 应用程序已关闭,但未靠近框架
【发布时间】:2015-07-29 14:30:21
【问题描述】:

我正在用 java 开发一个桌面应用程序,当应用程序被框架关闭时,我有一个事件调用 FrameClosing,它在用户关闭窗口时创建一个函数,问题是当应用程序被任务管理器关闭时,或者当用户关闭窗口并且应用程序正在运行,我正在尝试这个。

Runtime.getRuntime().addShutdownHook(new Thread() {

    @Override
    public void run() {

       System.out.println("app was stoped");
    }

});

但它只有在应用程序被框架关闭时才有效。我正在阅读有关套接字的信息,我的应用程序可以与网站进行通信,如果它们之间的通信我可以检测到程序已关闭,但我并不太了解它 我只想检测我的应用何时停止运行

【问题讨论】:

  • 什么应用?移动应用、Web 应用、独立 Java 程序?
  • 一个选项可以是检查主体是否还活着的第二个进程
  • 但是如果用户在进程打开的情况下关闭窗口会发生什么?

标签: java


【解决方案1】:

您的代码是正确的。如果它是通过任务管理器杀死的,尽管那是故事的结尾。它在运行 System.out.println 之前被杀死。如果不是这种情况,您将能够在用户说他们想杀死它之后做各种各样的事情。

【讨论】:

    【解决方案2】:

    This answer is talking about C++ 但第二点是重要的部分。如果程序被任务管理器或kill -9 杀死,那么你真的无能为力。该程序无权访问该级别,您必须让该程序专门寻找该级别。

    您是否考虑过设计应用程序以使意外关闭不会破坏交易,而不是尝试处理这个问题?例如,在程序运行时进行中间日志记录。您可以使用它来确定应用程序在下次运行时是否过早关闭,并在它开始工作之前执行任何必要的操作。

    您也可以查看this thread。它谈论通过命令行进行杀戮,但在某些情况下它可能会对您有所帮助。:

    Logically, SIGHUP (terminal hangup) should be raised.
    
    The equivalent of SIGHUP is provided through the callback you register with
    SetConsoleCtrlHandler. Your callback function will be called on an 
    arbitrary threadpool thread with dwCtrlType = CTRL_CLOSE_EVENT. You've got 
    5 seconds to clean-up, you cannot cancel the close.
    

    【讨论】:

    • 我的应用程序向 php 页面发送请求以在应用程序关闭时通知用户已连接发送另一个请求以通知用户已断开连接但如果应用程序未从 X 按钮关闭窗户什么也没发生
    • @DarwinRosso 有一个简单的解决方案:超时。您的应用程序必须每 X 秒向 php 页面发送一个信号(“心跳”)。如果没有,则客户端已关闭。
    • 如何使用 java 和 php 做到这一点?
    • @Darwin 设置心跳协议:每隔一段时间(比如,每秒一次),向 PHP 发送相当于“嘿,我还活着”的内容。一旦 PHP 在 10 秒左右没有看到该消息,它就会自动开始其关闭过程
    猜你喜欢
    • 2010-09-08
    • 2011-09-04
    • 1970-01-01
    • 2013-06-09
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多