在Java中为系统托盘创建单个实例

5

我正在一款使用Java创建的桌面应用程序中工作。我们正在为Windows版本(在Windows操作系统上运行)进行开发。当我们运行应用程序时,它会使用SystemTray在桌面上创建一个托盘图标。

SystemTray tray = SystemTray.getSystemTray();

我正在创建系统托盘的单个实例,这个实例是在应用程序的主类中创建的。
我正在为我的应用程序创建exe文件。我的问题是,当我运行应用程序的exe文件时,它每次都会创建一个托盘图标。
我希望在我的应用程序中,只有一个托盘图标存在于桌面上并作为服务运行。仅当应用程序被卸载时,该图标才应该被删除。它应该在后台作为服务运行。
我无法找到任何方法来帮助我将我的应用程序作为服务运行,并且只有一个实例在后台运行。
我想通过创建托盘图标作为服务来运行我的应用程序,并且应该只有一个实例存在。请在这个问题上给予我指导。
提前感谢您所有宝贵的建议。
3个回答

2
如Mudassir所说,你应该在启动程序时添加一个检查,尝试查找另一个正在运行的应用程序实例。这可以通过在启动时创建特定文件并在关闭时删除它来完成。如果在启动应用程序时已经存在该文件,则意味着另一个实例正在运行。 你还可以使用进程间通信,但比简单文件更难。
对于“服务”部分,你可以在启动时隐藏主窗口,这样你的应用程序将运行得就像是一个Windows服务。

谢谢您的回答,我希望这对我有用。请再详细说明一些服务部分。 - Toman
我认为在Java中创建一个Windows服务是不可能的,也就是说无法创建一个可以在启动时自动运行并像其他标准Windows服务一样进行管理的服务。但是您可以通过在注册表中添加条目来实现类似的功能(搜索“windows automatic startup”之类的内容)。当您的程序启动时,它将检查是否有另一个实例正在运行。如果没有,则会创建一个系统托盘图标,并隐藏其窗口(如果实际上使用了某种GUI)。 - Bastien Jansen

1

让您的应用程序成为单实例。请告诉我如何在Java中制作.EXE文件?


感谢回答,Mudassir。我正在使用高级安装程序创建exe文件。高级安装程序使用jar文件并从jar文件创建exe文件。 - Toman

1

为了让托盘图标出现,您的应用程序必须在运行中。如果您的托盘图标似乎出现了两次(或更多),那么您的应用程序运行了多次。您需要自己添加一个检查。

您不希望将应用程序作为Windows服务运行,因为通常这些服务无法访问Windows桌面。


你不想将你的应用程序作为Windows服务运行,因为通常这些服务无法访问Windows桌面。也许Toman正在尝试制作一种反病毒类型的程序,该程序在后台运行,并通过系统托盘图标显示其存在。 - Mudassir
@Mudassir 在这种情况下,他应该将其拆分为两个应用程序。一个用于Windows后台服务,另一个用于通过网络或其他方式连接。 - ZeissS
感谢您的评论。我的应用程序是用于在线备份的。它会备份您选择的文件并自动更新到服务器,因此需要在后台作为服务运行。我正在创建一个系统托盘的单个实例在应用程序的主类中,但是我的应用程序无法识别是否已经存在任何实例。 - Toman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接