Electron 生命周期看这篇就够了

应在 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

在窗口开始加载的时候触发,添加监听有两种方法,下面的**unlaodbeforeunload** 也是一样:

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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)

最后

总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习

还有更多学习笔记面试资料也分享如下:

都是“Redis惹的祸”,害我差点挂在美团三面,真是“虚惊一场”

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
学起的朋友,同时减轻大家的负担。**[外链图片转存中…(img-bXpUsOXx-1713839475765)]

[外链图片转存中…(img-ZYGlhLG1-1713839475766)]

[外链图片转存中…(img-pTfqv0q0-1713839475766)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)

[外链图片转存中…(img-OU2VrzSR-1713839475766)]

最后

总而言之,面试官问来问去,问的那些Redis知识点也就这么多吧,复习的不够到位,知识点掌握不够熟练,所以面试才会卡壳。将这些Redis面试知识解析以及我整理的一些学习笔记分享出来给大家参考学习

还有更多学习笔记面试资料也分享如下:

[外链图片转存中…(img-fttKrrVp-1713839475767)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值