electron有两个单例模式的函数(详见文末链接),在相关的项目中,一旦试图打开第二个相同程序的时候,就会触发app.quit()函数。 那么本文的主要内容,就是讲述如何捕获这个第二个实例的初始化事件,并做出相关动作分析,这个事件名称就是second-instance

苏南大叔:electron中,如何识别处理second-instance事件? - electron-second-instance
electron中,如何识别处理second-instance事件?(图3-1)

本文测试环境:electron@5.0.1。本代码在macwin10centos中都测试通过,启动第一个及第二个实例的办法,都是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)
}

相关文章:

测试代码

测试代码如下:

const {app, BrowserWindow,dialog} = require('electron')
//...
app.on('second-instance', (event, argv) => {
  dialog.showMessageBox({
    title: "second",
    message: "second:" + argv.join(""),
  });
});

苏南大叔:electron中,如何识别处理second-instance事件? - electron-second-instance-code
electron中,如何识别处理second-instance事件?(图3-2)

正常的app逻辑里面,并不会这样弹出个dialog出来。所以,请注意分析接收argv参数,这个是后续逻辑处理的关键因素。因为这里苏南大叔并没有相关需求,所以,这里的argv并不做深入处理。

因为相关代码涉及到两个实例,事实上,这个second-instance事件是在第一个实例中触发的,而不是第二个实例。

特殊说明

目前在win10centos测试环境下,通过双击或者npm start都是可以正确触发second-instance事件的。mac的调试环境下,也是可以正确触发second-instance事件的。

苏南大叔:electron中,如何识别处理second-instance事件? - electron-second-instance-dialog
electron中,如何识别处理second-instance事件?(图3-3)

second-instance事件,用到的概率不是很大。目前来看,需要特殊注意mac下的情况,至于win10centos,应该都是不会有问题的。

mac下的second-instance事件,和其它操作系统不一样,有特例!具体见如下文章:

centos系统下,在苏南大叔的测试中,并没有能支持electron的注册伪协议。但是,触发second-instance事件的方式,并非只有伪协议一种。所以,centos也是可以检测到second-instance事件的,这个并不矛盾。

相关链接

本文中的second-instance事件,大概率情况下,是伴随着single-instance-lock函数而使用的。所以,苏南大叔推荐您,查看下面的两篇经验文字:

文中的dialog组件的使用说明:

总结

本文中针对electronsingle-instance-lock函数,伴发的second-instance事件进行处理。主要的关注点有两个:

  • 需要重点关注argv数组,通过argv的分析,进行下一步操作。
  • mac系统会有特殊情况,详见后续文字。

更多electron的相关经验文字,请点击苏南大叔的文章:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接作者。
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
未经许可,规模化镜像抄袭本站内容的行为,将会根据有关法律法规进行维权。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。

 【加群】加入QQ群【175454274】和大家一起讨论这个问题

 【源码】本文代码片段及相关软件,请点此获取

 【绝密】秘籍文章入口,仅传授于有缘之人   electron

本站的忠实读者小伙伴,正在阅读下面这些文章: