在做java桌面应用程序时,双击程序的快捷启动图标,桌面程序就会打开。再次双击,又会打开一个新的桌面应用程序。如果软件中的某些值是不允许共享和并发的,比如端口占用等。因此必须找到一种方法使得无论双击多少次启动图标,我们的应用程序都只会打开一个。那么该怎么解决呢?
我想到的大概有两种方法:
1.在本地应用程序的目录下,新建一个文件,文件中可存储一个作为标记的变量,设为flag,每次运行应用程序时,都读取和赋值给flag,进而来判断软件是否已经被打开。然后再做相关的处理。
2.利用jni的方法,通过操作系统来判断应用程序的进程是否已经存在。
我是用第二种方法做的。下面简要说一下步骤:
(1)在java工程中创建本地化结构方法,设为private native int getInstance();
(2)编译运行java文件,得到class文件,利用jni命令生成对应的.h头文件,注意路径中的空格
(3)在VC中创建一个空的dll文件,实现上述.h头文件中的包含的本地化方法,代码如下:
#include <jni.h>
#include <windows.h>
#include "com_TestSingle.h" //由jni命令根据java文件生成的.h头文件
HANDLE hMutex;
JNIEXPORT jint JNICALL Java_com_TestSingle_getInstance(JNIEnv *env, jobject obj)
{
hMutex = CreateMutex(NULL, FALSE, "SingletonInstance");
if(hMutex)
{
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
return JNI_TRUE;
}
}
return JNI_FALSE;
}
其中CreateMutex的解释见http://bike.baidu.com/view/1285853.html?fromTaglist
参数中字符串“SingletonInstance”是随意起的,这个无所谓
(4)编译,运行后将生成的dll文件放到java源文件中去加载
(5)在java类的构造函数或者初始化的某个地方加上判断即可,实例代码如下
if(getInstance() == 1)
{
JOptionPane.showMessageDialog(null, "程序已经在运行!");
System.exit(0);
}