electron中,如何识别处理second-instance事件?
发布于 作者:苏南大叔 来源:程序如此灵动~electron
有两个单例模式的函数(详见文末链接),在相关的项目中,一旦试图打开第二个相同程序的时候,就会触发app.quit()
函数。 那么本文的主要内容,就是讲述如何捕获这个第二个实例的初始化事件,并做出相关动作分析,这个事件名称就是second-instance
。
本文测试环境:electron@5.0.1
。本代码在mac
、win10
及centos
中都测试通过,启动第一个及第二个实例的办法,都是npm start
/双击程序体。
前提条件
根据苏南大叔的测试,如果想正常使用本文代码,检测出second-instance
事件。那么,前提是:使用了单例模式。那么,您可能需要下面的代码:
const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
app.quit()
} else {
/*
app.on('second-instance', (event, commandLine, workingDirectory) => {
if (mainWindow) {
if (mainWindow.isMinimized()) mainWindow.restore()
mainWindow.focus()
}
})
*/
app.on('ready', createWindow)
}
相关文章:
- https://newsn.net/say/electron-single-instance-lock.html
- https://newsn.net/say/electron-single-instance.html
测试代码
测试代码如下:
const {app, BrowserWindow,dialog} = require('electron')
//...
app.on('second-instance', (event, argv) => {
dialog.showMessageBox({
title: "second",
message: "second:" + argv.join(""),
});
});
正常的app
逻辑里面,并不会这样弹出个dialog
出来。所以,请注意分析接收argv
参数,这个是后续逻辑处理的关键因素。因为这里苏南大叔并没有相关需求,所以,这里的argv
并不做深入处理。
因为相关代码涉及到两个实例,事实上,这个second-instance
事件是在第一个实例中触发的,而不是第二个实例。
特殊说明
目前在win10
和centos
测试环境下,通过双击或者npm start
都是可以正确触发second-instance
事件的。mac
的调试环境下,也是可以正确触发second-instance
事件的。
second-instance
事件,用到的概率不是很大。目前来看,需要特殊注意mac
下的情况,至于win10
和centos
,应该都是不会有问题的。
mac
下的second-instance
事件,和其它操作系统不一样,有特例!具体见如下文章:
centos
系统下,在苏南大叔的测试中,并没有能支持electron
的注册伪协议。但是,触发second-instance
事件的方式,并非只有伪协议一种。所以,centos
也是可以检测到second-instance
事件的,这个并不矛盾。
相关链接
本文中的second-instance
事件,大概率情况下,是伴随着single-instance-lock
函数而使用的。所以,苏南大叔推荐您,查看下面的两篇经验文字:
- https://newsn.net/say/electron-single-instance-lock.html
- https://newsn.net/say/electron-single-instance.html
文中的dialog
组件的使用说明:
总结
本文中针对electron
的single-instance-lock
函数,伴发的second-instance
事件进行处理。主要的关注点有两个:
- 需要重点关注
argv
数组,通过argv
的分析,进行下一步操作。 mac
系统会有特殊情况,详见后续文字。
更多electron
的相关经验文字,请点击苏南大叔的文章:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。