Вы пытались использовать ApplicationManager , чтобы справиться с этим?Если у вас есть фоновый системный процесс, прослушивающий события, возможно, ваш GUI-процесс даже не запущен (т. Е. Если вы сделали System.exit(0)
, а не фоновую обработку).Вот фрагмент кода, который можно использовать для поиска процесса графического интерфейса пользователя (на основе его дескриптора приложения) и либо вывести его на передний план (если он запущен), либо запустить его (если это не так):
// Check if app is already running
ApplicationDescriptor descriptor = [descriptor for your GUI entrypoint];
ApplicationManager appManager = ApplicationManager.getApplicationManager();
int pid = appManager.getProcessId(descriptor);
if (pid != -1) {
// App is running, bring it to the foreground
appManager.requestForeground(pid);
} else {
// App is not running, so launch it
try {
appManager.runApplication(descriptor);
} catch (ApplicationManagerException e) {
// Can't launch
}
}
Чтобы получить дескриптор приложения для вашей точки входа GUI, используйте следующую методологию:
- Получите дескриптор модуля, используя
CodeModuleManager.getModuleHandleForClass(MyApp.class)
- Получите список дескрипторов приложения для дескриптора, используя
CodeModuleManager.getApplicationDescriptors(handle)
- Проверяйте флаги в каждом дескрипторе, пока не найдете один из них, равный «0».Это означает, что это не дескриптор системы / автозапуска / запуска при запуске - возможно, ваша точка входа в GUI.