应在 ready 之前对 open-file
进行监听。如果自己接管文件的打开,应该**event.preventDefault()
**
触发条件:
-
应用已经打开,并且通过扩展名或者 macOS 命令行中的 open 命令打开文件的时候,触发
-
拖放一个文件到 Dock 但应用还没有运行的时候触发
Windows 电脑中,需要通过主进程的 process.argv 进行解析
事件:****open-url
返回:****event
: Event, url
: string
事件open-url
是系统通过 Electron 应用打开 url 时触发,如果想要自己接管打开url,应该调用**event.preventDefault()
**。并且要在 info.plist 中定义 url scheme,如果是 Electron Builder 打包的,可以找到 extendInfo 配置,能省去很多麻烦。
原话是这么说的:Your application’s Info.plist file must define the URL scheme within the CFBundleURLTypes key, and set NSPrincipalClass to AtomApplication.
// main.ts
// for electron-test://abc?query1=value1
app.setAsDefaultProtocolClient(‘electron-test’);
app.on(‘will-finish-launching’, (event: Event) => {
log(==> app-event: will-finish-launching <===
);
app.on(‘open-url’, (event: Event, url: string) => {
log(==> app-event: open-url <===
, url);
});
});
这样在实现后,比如在浏览器中输入electron-test://abc?query1=value1 地址就可以打开 Electron 应用,并且open-url 就可以捕获到这个路径信息。
事件:****activate
[macOS]
返回:****event
: Event, hasVisibleWindows
: boolean
事件activate
只会在【首次启动应用程序】、【在程序已经运行后再次打开程序】或【单击应用程序的坞站或任务栏图标时】重新激活它。如果是使用 Cmd+Tab
切换,是不会激活的,这个时候需要**did-become-active
** 。
这里的再次打开程序是,macOS 默认是让应用单例模式,如果尝试运行另外一个实例,就会 activate 已经运行的实例。
事件:****did-become-active
返回:event: Event
事件**did-become-active
**则会在切换到这个应用的时候触发,比如没有窗口的应用或者程序第一次启动。
事件:****session-created
返回:session
: Session
创建一个 default session,常用于网络请求环境的隔离。
事件:****web-contents-created
返回:****event
Event,window
: BrowserWindow
创建 webContents 的上下文环境就绪。有可能会被初始化多次
事件:****browser-window-created
返回:event: Event, window
: BrowserWindow
创建一个窗口,都是依次以 session-created
, web-contents-created
,browser-window-created
创建。但不知道为什么在 appready
事件后,又触发了事件 web-contents-created
。
事件:second-instance
返回:event: Event, argv: string[],workingDirectory
: string
在 macOS 中大多数情况启动应用程序是单例模式,当再启动的时候,如果调用了**app.requestSingleInstanceLock()
** 就会在原来运行中的应用触发这个事件,新的应用可以控制是否退出。
事件:****window-all-closed
**返回:**无
当应用所有窗口关闭后触发,其它情况,比如**app.quit
**、 cmd+q
或者菜单的退出,或者任何其它方式的退出软件都不会触发。
默认不监听这个事件,关闭所有窗口自动退出应用。一旦监听了这个事件,那么所有窗口关闭后不会退出应用,需要开发者自己控制。
事件:****before-quit
返回:****event
: Event
**中断:**可以
任何常规尝试关闭应用的行为都会马上触发。Electron 文档中说**autoUpdater.quitAndInstall()
** 会关闭所有的窗口,然后调用**app.quit()
**。
事件:****will-quit
返回:event: Event
**中断:**可以
在不监听**window-all-closed
** 时,所有的窗口都关闭后触发 will-quit
。如果**window-all-closed
** 被监听了, will-quit
被触发了 window-all-closed
也不会被触发。
事件:****quit
返回:****event
: Event, exitCode
: number
在 Windows 系统中,如果应用程序因系统关机/重启或用户注销而关闭,那么 **before-quit
**和 quit
事件不会被触发。
▐ BrowserWindow 事件介绍
事件:****close
返回:****event
: Event
要比 Web 中的 DOM 事件 unload
和 beforeunload
要早,在一般情况下,都是通过 beforeunload
处理窗口关闭的事情:
window.onbeforeunload = (e) => {
console.log(‘I do not want to be closed’)
e.returnValue = false // equivalent to return false
but not recommended
}
事件:****closed
**返回:**无
因为这是个异步事件,所以回调的方法无法影响 BrowserWindow 的生命周期。
事件**:****ready-to-show
**
**返回:**无
这个窗口属性如果是**show:true
**,也会在没显示的时候就触发事件。
▐ Renderer 进程中的 Web 事件介绍
事件:window:load
返回:****event
: Event
在窗口开始加载的时候触发,添加监听有两种方法,下面的**unlaod
和beforeunload
** 也是一样:
window.onload = (event: Event) => {
console.log(event.type) // output: load
}
window.addEventListener(‘load’, (event: Event) => {
console.log(event.type) // output: load
})
**事件:**window: unload
返回:****event
: Event
unload 事件不会被中断。
一般情况下,Electron 退出是来不及发出 unload 事件的,只有关闭窗口和重载窗口会发出。
事件:window:beforeunload
返回:****event
: Event
**中断:**可以
返回非 undefined 就会中断主进程 BrowserWindow 的 close 事件
在窗口重载的时候,也会被触发
**事件:**document: DOMContentLoaded
返回:****event
: Event
等所有 DOM 准备好后触发。
退出场景
▐ 正常退出
-
Cmd+q
或者菜单中的退出按钮,Windows 中Alt+F4
-
app.quit()
-
autoupdater.quitAndInstall()
-
app.reluanch()
▐ 异常退出
比如常见的在主进程调用 process.crash()
。
▐ SIG 信号退出
我们常见的命令行退出软件的方式有 Ctrl+c ,命令行给进程发送了 SIGKILL 信号,其实还有其它常见关闭进程的方式,可以通过 kill 对进程发送信号,比如 kill -s KILL 24567 或者 kill -9 24567 :
1 HUP (hang up)
2 INT (interrupt)
3 QUIT (quit)
6 ABRT (abort)
9 KILL (non-catchable, non-ignorable kill)
14 ALRM (alarm clock)
15 TERM (software termination signal)
▐ 具体的退出例子
1 正常命令行启动,通过**Cmd+q
**退出
> app-event: will-finish-launching <=
> app-event: session-created <=
> app-event: web-contents-created <=
> app-event: browser-window-created <=
> app-event: ready <=
> app-event: did-become-active <=
> app-event: web-contents-created <=
> html-event: DOMContentLoaded <=
> html-event: load <=
> window-event: ready-to-show <=
> app-event: before-quit <=
> window-event: close <=
> html-event: beforeunload <=
> app-event: will-quit <=
> app-event: quit <=
> window-event: closed <=
> window-event: closed <= 这个事件最后才发送是因为 closed 完全是异步的,被触发后就啥都不管了。使用 app.reluanch() 也是和 cmd+q 一样,不会触发 unload 事件。
2 正常启动,通过**ctrl+c
**退出
…
> window-event: ready-to-show <=
^C==> app-event: before-quit <===
启动后,所有事件正常,但退出通过 ctrl+c 中断应用, Electron 就只发出了 before-quit 事件。试试其它方法:
-
SIGHUP
和正常的退出流程大概一致 -
SIGINT
是 ctrl+c 发出的信号 -
SIGQUIT
会导致整个应用完全没有任何反应就退出 -
SIGABRT
效果同上 -
SIGKILL
效果同上 -
SIGSEGV
效果同上,也是 process.crash() 发出的信号 -
SIGTERM
和正常的退出流程一致,也是 app.quit() 的退出方式
3 正常启动,通过 app.exit() 退出
通过这种方式退出,与 process.exit()
一样,只会触发 quit 事件。
> html-event: DOMContentLoaded <=
> window-event: ready-to-show <=
> app-event: quit 0 <=
4 正常启动,通过 beforeunload 中断退出
通过 beforeunload 中调用 event.returnValue = false
中断应用的退出和窗口的关闭:
window.onbeforeunload = (event: Event) => {
log(‘beforeunload’)
event.returnValue = true
}
通过 cmd+q 会重复调用下面三个事件:
> app-event: before-quit <=
> window-event: close <=
> html-event: beforeunload <=
如果是直接关闭窗口:
> window-event: close <=
> html-event: beforeunload <=
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
<===
> html-event: beforeunload <=
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-6pbb18xb-1714788067911)]
[外链图片转存中…(img-uXOE0IEp-1714788067912)]
[外链图片转存中…(img-cNXovI41-1714788067912)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!