该页面翻译自 Google Chrome Extensions 与 Google Chrome Apps。除非特别说明,该页面的内容遵循 Creative Commons Attribution 3.0 License,代码示例遵循 BSD License。
事件页面与后台网页十分相似,但是有一个重要的区别:事件页面只在需要时加载,当事件页面当前不活动时将会卸载,释放内存及其他系统资源。
从 Chrome 22 的稳定版开始可以使用事件页面,它具有明显的性能优势,尤其在低功耗设备上。请您在开发新的扩展程序时尽可能首先考虑事件页面,而不是持久存在的后台页面,并开始将现有的后台页面迁移到这一新模型。
在扩展程序的清单文件中注册您的事件页面:
{ "name": "我的扩展程序", ... "background": { "scripts": ["eventPage.js"], "persistent": false }, ... }
注意,如果没有 "persistent" 键,您将得到一个普通的后台网页。是否持久存在是事件页面与后台网页之间的根本区别。
事件页面在“需要”时加载,再次进入空闲状态后卸载。如下是一些可能使事件页面加载的例子:
runtime.getBackgroundPage
。
一旦加载后,只要它仍然处于活动状态(例如,调用扩展程序 API 或发出网络请求),事件页面会继续运行。此外,直到所有可见视图(例如弹出窗口)关闭并且所有消息端口都关闭后,事件页面才会卸载。注意,打开某个视图并不会使事件页面载入,只会在载入后防止它关闭。
确保您的事件页面在打开它的事件处理完之后立刻关闭。您可以打开 Chrome 浏览器的任务管理器,观察您的事件页面的生命周期。您的扩展程序对应的条目在进程列表中出现时您可以注意观察,看出您的事件页面的加载与卸载。
一旦事件页面保持一段时间(几秒钟)的空闲状态,将触发 runtime.onSuspend
事件。事件页面在强制卸载之前,还有几秒钟的时间来处理该事件。如果在这段时间内产生了通常会使事件页面载入的事件,卸载操作将取消,并产生
runtime.onSuspendCanceled
事件。
Chrome 浏览器会追踪应用或扩展程序监听的事件。分发这样的事件时,将加载扩展程序的事件页面。相反,如果应用或扩展程序通过调用 removeListener 移除所有的监听器,Chrome 浏览器不会再为那一事件加载其事件页面。
因为监听器本身只在事件页面的环境中存在,您必须每次在事件页面加载时使用
addListener
,仅仅在 runtime.onInstalled 这么做是不够的。
有关事件注册操作的具体例子,您可以查看Google Mail Checker扩展程序。
请根据下列清单,将您的扩展程序的(持久)后台网页转换为事件页面。
"persistent": false
,如上所示。
window.setTimeout()
或
window.setInterval()
,请改用定时器
API。如果事件页面已关闭,基于 DOM 的定时器不会触发。
extension.getBackgroundPage
,请改用
runtime.getBackgroundPage
。新方法是异步的,所以如果有必要的话它可以在返回前启动事件页面。
使用事件页面时请牢记这些技巧,避免一些常见而又微妙的陷阱。
tabs.onUpdated
事件,尝试改用
webNavigation.onCompleted
事件并使用过滤器(标签页 API
不支持过滤器),这样,您的事件页面仅在您感兴趣的事件产生时才会加载。
runtime.onSuspend
事件。然而,我们建议您定期保存数据,这样如果您的扩展程序由于崩溃而没有接收到
onSuspend
事件时,一般情况下也不会丢失数据。
contextMenus.create
传递一个字符串的
id
参数,并使用 contextMenus.onClicked
回调函数代替 contextMenus.create
的
onclick
参数。