2010-03-27 67 views

回答

17

HereJava的單應用程序實例的例子:

單個實例應用程序是一種只允許到無論用戶嘗試多少次啓動運行的應用程序1。

該應用程序嘗試打開特定端口上的套接字。如果您的應用程序的另一個實例已在運行,則打開套接字將失敗。

這對您已經足夠了,因此您不必使用用於將新應用程序註冊到第一個應用程序的代碼部分。

與將某種標誌寫入文件系統/註冊表/任何內容相比,使用套接字有一個很大的優勢:
即使應用程序崩潰,它也會被刪除。

+0

使用套接字似乎是一個非常有用的想法 - 比我提到的文件鎖更可靠。 – 2010-03-27 12:31:28

+0

感謝您回覆 您給出的解決方案非常完美。 – chetan 2010-03-29 13:31:55

+0

但是使用哪個端口號?就我個人而言,我會在運行時分配一個端口,並且在臨時目錄中寫入一個小文件以保存所選端口號似乎是不可避免的。 – 2011-11-22 08:13:19

1

它實際上聽起來像你只想要一個應用程序一次打開。在這種情況下,爲什麼不在應用程序運行時取出文件鎖定或類似內容,並檢查啓動時是否啓動。當你的程序沒有完全退出時,頭痛(當然)會清除鎖定。

1

正如Peter Lang所鏈接的,我的首選解決方案是使用套接字。當您的應用程序啓動時,您可以啓動服務器套接字監聽localhost上的傳入連接(以及您選擇的端口)。在代碼中發生這種情況之前,您可以嘗試連接到服務器套接字,如果成功,您知道還有另一個實例已經打開,因此您可以使用適當的消息退出當前實例。

在您的服務器套接字實現中,您還可以添加在接收傳入連接時實際強制應用程序的當前實例到前臺的功能。

0
public class Samp { 

    JFrame f=new JFrame(); 
    File ff=new File("D:\\a.txt"); 
    FileWriter fw; 

    public Samp() { 
     f.setBounds(0, 0, 200, 200);  
     try { 
      Scanner sc=new Scanner(ff); 
      if(!sc.hasNext()) {   
       fw=new FileWriter(ff); 
       fw.write("Running"); 
       fw.close(); 
      } else { 
       System.exit(0); 
      } 
     } catch(Exception e) { 
      System.out.println(e.getMessage()); 
     } 

     WindowListener wndCloser = new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       try { 
        Scanner sc = new Scanner(ff); 
        if(sc.hasNext()) { 
         fw=new FileWriter(ff); 
         fw.write(""); 
         fw.close(); 
        } 
       } catch (Exception ex) { } 
      } 
     }; 

     f.setVisible(true); 
     f.addWindowListener(wndCloser); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public static void main(String args[]) { 
     new Samp(); 
    } 
} 
0

你的意思是運行像一個單身的GUI?我已經在過去通過使靜態私有「視圖管理器」,使其爲空,而不是創建或可見第一次GUI直到做到了這一點在創建之後,就像使用經典單例一樣,當應用程序再次運行時,GUI被設置爲可見的......我有幾個框架遵循此設計 - 在這些框架中,GUI不是「主要」也是命令行和類似的接口,所以通過命令行召喚GUI ...

0

使用單數模式,如example所示!

相關問題