Chrome 应用生命周期

应用运行时和事件页面负责管理应用生命周期。应用运行时会管理应用安装、控制活动页面,并且可以随时关闭应用。事件页面会监听来自应用运行时的事件,并管理要启动的内容以及启动方式。

生命周期的运作方式

应用运行时从用户的桌面加载活动页面,并触发 onLaunch() 事件。此事件会告知活动页面要启动哪些窗口以及它们的尺寸。

应用生命周期的运作方式

当事件页面没有正在执行的 JavaScript、没有待处理的回调和没有打开的窗口时,运行时会卸载事件页面并关闭应用。在卸载事件页面之前,系统会触发 onSuspend() 事件。这样,活动页面就有机会在应用关闭之前执行简单的清理任务。

创建活动页面和窗口

所有应用都必须提供活动页面。本页包含应用的顶级逻辑,它自己的界面没有,并负责为所有其他应用页面创建窗口。

“创建活动”页面

如需创建活动页面,请在应用清单中添加“background”字段,并在脚本数组中添加 background.js。事件页面使用的所有库脚本都需要先添加到“background”字段中:

"background": {
  "scripts": [
    "foo.js",
    "background.js"
  ]
}

您的事件页面必须包含 onLaunched() 函数。当应用以任何方式启动时,系统都会调用此函数:

chrome.app.runtime.onLaunched.addListener(function() {
  // Tell your app what to launch and how.
});

创建窗口

活动页面可以自行创建一个或多个窗口。默认情况下,这些窗口是通过与事件页面建立脚本连接而创建的,并且可以通过事件页面直接编写脚本。

Chrome 应用中的窗口与任何 Chrome 浏览器窗口都没有关联。它们包含一个带有标题栏和尺寸控件的可选框架,以及建议的窗口 ID。没有 ID 的窗口在重启后不会恢复到其大小和位置。

以下是使用 background.js 创建的窗口示例:

chrome.app.runtime.onLaunched.addListener(function() {
  chrome.app.window.create('main.html', {
    id: 'MyWindowID',
    bounds: {
      width: 800,
      height: 600,
      left: 100,
      top: 100
    },
    minWidth: 800,
    minHeight: 600
  });
});

包括发布数据

根据应用的发布方式,您可能需要在活动页面中处理发布数据。默认情况下,当应用由应用启动器启动时,不会有启动数据。对于具有文件处理程序的应用,您需要处理 launchData.items 参数,以允许这些应用随文件一起启动。

监听应用运行时事件

应用运行时控制应用安装、更新和卸载。您无需执行任何操作即可设置应用运行时,但您的事件页面可以监听 onInstalled() 事件以存储本地设置,并监听 onSuspend() 事件以在事件页面卸载之前执行简单的清理任务。

存储本地设置

在应用首次安装或更新时,系统会调用 chrome.runtime.onInstalled()。每当调用此函数时,系统都会触发 onInstalled 事件。事件页面可以监听此事件,并使用 Storage API 存储和更新本地设置(另请参阅存储空间选项)。

chrome.runtime.onInstalled.addListener(function() {
  chrome.storage.local.set(object items, function callback);
});

防止数据丢失

用户可以随时卸载您的应用。卸载后,系统不会留下任何正在执行的代码或私密数据。这可能会导致数据丢失,因为用户可能会卸载本地修改且未同步的数据的应用。您应存放数据,以防数据丢失。

您至少应存储用户设置,以便用户重新安装您的应用时,其信息仍可供重复使用。使用 Storage API (storage.sync),用户数据可以自动与 Chrome 同步。

在应用关闭之前进行清理

应用运行时会先将 onSuspend() 事件发送到事件页面,然后再取消加载该页面。您的事件页面可以监听此事件,在应用关闭之前执行清理任务并保存状态。

此事件触发后,应用运行时会开始关闭应用。如果应用有打开的窗口,则日后可能会通过 onRestarted 事件重启。在这种情况下,应用应将其当前状态保存到永久存储空间,以便在收到 onRestarted 事件时以相同状态重启。应用只有几秒钟的时间来保存其状态,之后便会终止,因此最好在应用正常运行时逐步保存应用状态。

收到 onSuspend 后,系统将不会再向应用传送任何事件,除非暂停因某种原因而被中止。在这种情况下,系统会将 onSuspendCanceled 传送给应用,并且不会卸载应用。

chrome.runtime.onSuspend.addListener(function() {
  // Do some simple clean-up tasks.
});