Приложение открылось дважды: как принять второй запуск
Чтобы приложение не открывалось дважды, сначала определите смысл повторного запуска: показать существующее окно, открыть переданный файл или создать отдельное рабочее пространство. Затем ограничьте число экземпляров по выбранной модели и передайте действие основному процессу. Одна блокировка не делает свёрнутое окно видимым и не объясняет, что произошло с документом, который пользователь пытался открыть.
Повторный запуск — это действие пользователя
Учебный редактор уже открыт, а человек дважды нажимает файл в проводнике. Если второй процесс просто прекращает работу, отдельного окна действительно не будет. Но если основной экземпляр не получил файл или остался свёрнутым, пользователь решит, что команда пропала. Внешне требование «только один процесс» выполнено, а задача открытия — нет.
У настольного приложения отдельно опишите процессы, окна и рабочие пространства. Один процесс может управлять несколькими окнами, а разным рабочим пространствам могут требоваться независимые состояния. Не выбирайте режим только потому, что в примере фреймворка показано одно окно. Сначала согласуйте, чего ожидает пользователь от каждого способа запуска.
Что предоставляет Electron
В документации app requestSingleInstanceLock возвращает результат получения блокировки, а уже действующий экземпляр может получить событие second-instance с данными повторного запуска. Это строительные элементы выбранного поведения. Приложение само определяет, какое окно показать и как обработать полученное намерение.
Не считайте получение блокировки подтверждением готовности интерфейса. Документация связывает second-instance с завершением события ready приложения, но конкретное окно или документ ещё могут находиться в своей стадии загрузки. Для таких случаев нужна предусмотренная обработка отложенного действия, а не попытка немедленно обратиться к отсутствующему окну.
Матрица повторных действий
Таблица задаёт собственную модель учебного редактора. В реальном продукте нужно отдельно определить область единственного экземпляра, профили и поддерживаемые операционные системы. Она не заявляет результаты испытаний Electron на всех конфигурациях.
| Действие | Основной экземпляр | Передаваемое намерение | Что видит человек | Что сохраняется |
|---|---|---|---|---|
| Повторно открыть ярлык | Окно видно и готово | Показать существующую работу | То же окно становится доступным | Текущий документ и положение в нём |
| Открыть ярлык при свёрнутом окне | Процесс работает, окно свёрнуто | Восстановить выбранное окно | Понятный возврат к работе | Несохранённые изменения |
| Открыть другой файл | Редактор занят текущим документом | Путь и согласованный способ открытия | Новая вкладка либо запрос по принятой политике | Исходный черновик не закрывается молча |
| Открыть уже открытый файл | Документ присутствует | Найти соответствующую работу | Переход к существующему документу | Его состояние и несохранённый текст |
| Повторить действие во время загрузки | Процесс запущен, нужный интерфейс не готов | Отложенная команда | Выполнение после готовности либо объяснимая ошибка | Действие не теряется без сообщения |
| Открыть недоступный файл | Рабочее окно существует | Безопасно разобранный запрос | Причина невозможности открытия | Остальная открытая работа |
Передавать нужно смысл, а не случайный набор аргументов
Определите допустимые действия и формат данных: показать окно, открыть документ, перейти к рабочему пространству. Не считайте последнюю часть командной строки всегда путём к файлу. Документация Electron отмечает, что в аргументы могут добавляться служебные значения. Разбирайте их по согласованному контракту, сохраняя границы параметров.
Файл с пробелами или необычными символами в названии должен оставаться одним именем. Проверяйте поддерживаемый тип и разрешённую обработку; полученная строка не является командой, которую нужно выполнить через оболочку. Секреты для входа и другие чувствительные данные не стоит передавать таким способом ради удобства второго запуска.
Для программы обработки документов важна и идентичность уже открытого файла. Два похожих названия могут означать разные документы, а разные представления пути — одну работу. Выберите проверяемое правило сопоставления в рамках поддерживаемой файловой среды. Не закрывайте текущий документ по одному совпадению короткого имени.
Окно должно стать доступным без потери работы
Опишите выбор целевого окна. Если их несколько, случайное первое окно может относиться к другому документу. Если последнее рабочее окно закрыто, но приложение продолжает работу по своей модели, повторный запуск требует отдельного решения. Этот сценарий нельзя считать эквивалентным свёрнутому окну без проверки.
При несохранённых изменениях не заменяйте содержимое новым файлом молча. Используйте выбранную политику вкладок, независимых окон или подтверждения перехода. Успешная передача намерения ещё не означает, что документ уже открыт: загрузка может завершиться ошибкой. Пользователь должен получить достоверный конечный результат.
Команда пришла раньше готовности документа
Сохраните отложенное действие до момента, когда его можно обработать по принятому жизненному циклу. Если таких действий несколько, определите порядок и допустимое объединение. Два открытия одного файла могут означать возврат к нему, но открытие двух разных файлов не должно превращаться в исчезновение первого только из-за общего флага «уже обрабатывается».
Разберите остановку основного процесса между получением и обработкой действия. Не обещайте безусловную доставку только из факта наличия события. Продукту нужен понятный итог и допустимый путь повторения. В протоколе приёмки фиксируйте, было ли действие обработано, отклонено с причиной или осталось неопределённым.
Платформенные пути проверяют отдельно
Открытие ярлыка, файла и ссылки может приходить разными путями в зависимости от системы и способа установки. Не переносите один обработчик на все платформы как доказанно одинаковый. Для программы Windows укажите соответствующие способы запуска и проверяйте конечную поставку, а не только запуск из среды разработки.
Область блокировки и профилей тоже требует решения. Разные пользователи операционной системы и независимые установки не должны неожиданно смешивать документы или данные. Это нужно включить в поддерживаемый контракт и испытания, не объявляя любой single-instance API глобальным диспетчером всех пользователей компьютера.
Прогон перед выпуском
- Согласуйте количество процессов, окон и рабочих пространств. Перечислите повторные действия, которые приложение обязано поддержать.
- Откройте учебную работу и повторите ярлык при видимом и свёрнутом окне. Проверьте фактическую доступность, не только число процессов.
- Откройте другой и уже открытый файл с несохранённым текстом. Сопоставьте результат с выбранной политикой документов.
- Повторите действие во время загрузки и после закрытия окна при работающем процессе, если продукт допускает такой режим.
- Испытайте недоступный путь и несколько быстрых намерений. Ошибка одного открытия не должна уничтожать остальные документы.
- Проверьте применимые пути в конечной установке поддерживаемой системы. Сохраните наблюдаемые результаты и ограничения.
Вопросы и ответы
Что означает Electron single instance?
Приложение выбирает ограничение экземпляров и обработку повторного запуска. Это не тождественно одному окну и само по себе не открывает переданный документ.
Достаточно ли app.requestSingleInstanceLock для повторного открытия?
Нет, результат блокировки нужно связать с поведением основного экземпляра и обработкой намерения. Отдельно проверьте окно, его готовность и сохранность текущей работы.
Что обрабатывать в Electron second-instance event?
Нужно разобрать поддерживаемое действие, выбрать целевое окно и безопасно обработать данные. Если окно ещё не готово, действие должно пройти предусмотренный отложенный путь либо получить понятный отказ.
Читайте также
Приложение Bubble на своём сервере: что придётся переделать
РазработкаСколько стоит второй язык сайта: как собрать смету
РазработкаВесы в веб-приложении: USB ещё не означает совместимость
РазработкаОфлайн-режим и синхронизация с 1С в приложении торгового агента
РазработкаВеб-приложение или сайт: в чём разница и как это влияет на цену
РазработкаПриложение без интернета: как согласовать объединение изменений карточки