Если вы хотите использовать цвета, предварительно определенные в платформе Android, используйте синтаксис @android: color / white. «Android:» в начале означает, что ресурс не является частью вашего приложения.
Я думаю, что ваше предложение открыть порт для прослушивания при запуске приложения - лучшая идея.
Это очень легко сделать, и вам не нужно беспокоиться об очистке при закрытии приложения. Например, если вы пишете в файл, но кто-то затем убивает процессы с помощью диспетчера задач, файл не будет удален.
Кроме того, если я правильно помню, нет простого способа получить PID процесса Java изнутри JVM, поэтому не пытайтесь формулировать решение, используя PID.
Что-то вроде этого должно помочь:
private static final int PORT = 9999;
private static ServerSocket socket;
private static void checkIfRunning() {
try {
//Bind to localhost adapter with a zero connection queue
socket = new ServerSocket(PORT,0,InetAddress.getByAddress(new byte[] {127,0,0,1}));
}
catch (BindException e) {
System.err.println("Already running.");
System.exit(1);
}
catch (IOException e) {
System.err.println("Unexpected error.");
e.printStackTrace();
System.exit(2);
}
}
Этот пример кода явно привязывается к 127.0.0.1
, что должно избегать любых предупреждений брандмауэра, поскольку любой трафик по этому адресу должен поступать из локальной системы.
При выборе порта старайтесь избегать порта, упомянутого в списке хорошо известных портов .
Поскольку в вопросе указано, что используется WebStart, очевидным решением является использование javax.jnlp.SingleInstanceService
.
Эта служба доступна в 1.5. Обратите внимание, что 1.5 в настоящее время почти полностью подошла к концу срока службы. Установите Java SE 6!
Я думаю, что лучше было бы использовать блокировку файлов (довольно старая идея :)). Начиная с Java 1.4 была представлена новая библиотека ввода-вывода, которая позволяет блокировать файлы.
После запуска приложения оно пытается получить блокировку файла (или создать его, если он не существует), когда приложение выходит из него, блокировка снимается. . Если приложение не может установить блокировку, оно завершается.
Пример выполнения блокировки файлов приведен, например, в Альманахе разработчиков Java .
Если вы хотите использовать блокировку файлов в приложении Java Web Start или апплет, необходимый для пения приложения или апплета.
Мы делаем то же самое в C ++, создавая объект мьютекса ядра и ища его при запуске. Преимущества те же, что и при использовании сокета, т.е. когда процесс умирает / аварийно завершается / завершается / завершается, объект мьютекса очищается ядром.
Я не программист на Java, поэтому я не уверен, вы можете делать то же самое на Java?
Вы могли бы использовать реестр, хотя это без особого энтузиазма противоречит цели использования языка высокого уровня, такого как java. По крайней мере, ваша целевая платформа - windows = D