首页 > 解决方案 > chrome 扩展:持久性后台脚本何时停止运行?

问题描述

如果我的 chrome 扩展有一个持久的后台脚本,我可以使用它将数据存储在我最终想要存储在 chrome.storage.local 中的脚本中。什么时候/什么事件触发后台脚本停止运行(以便我可以添加回调以在本地数据超出范围之前将数据存储在 chrome.storage.local 中)?

标签: javascriptgoogle-chrome-extensionlocal-storage

解决方案


后台脚本可以注册为持久(在启用扩展且未崩溃时始终运行)或非持久(不总是但runtime.getBackgroundPage在调用后台脚本中注册的任何运行时事件回调时临时运行)

它们在“背景”字段下的清单中注册,并且应将“持久”指定false为非持久背景脚本/页面。

}
  “背景”: {
    “脚本”:[“background.js”],
    “持久”:错误
  }
}

当非持久性后台脚本被卸载时有一个运行时事件回调(因为它们在几秒钟不活动后自行卸载),当具有持久性后台脚本的扩展被禁用(或崩溃时)它不会被调用 -课程)。

chrome.runtime.onSuspend.addListener(function() {
    console.log("正在卸载。");
});

您可以使用这个简单的扩展来验证这一点:

清单.json

{
  "name": "onSuspend",
  “描述”:“悬而未决”,
  “版本”:“1.0”,
  “清单版本”:2,
  “权限”:[
    “贮存”
  ],
  “背景”: {
    “脚本”:[“background.js”],
    “持久”:真的
  }
}

背景.js

chrome.runtime.onSuspend.addListener(function() {
  console.log("Unloading.");
  chrome.storage.local.set({"Saved": "yes"}, function() {});
});

chrome.storage.local.get("Saved", function(data) {
  console.log("shouldn't be an empty object": data);
});

我发现您可以在禁用持久性后台脚本之前注册回调以运行的唯一方法是加载背景页面并使用窗口的卸载事件,代码用于测试:

{
  "name": "停止持久后台脚本前的回调",
  "description": "停止持久性后台脚本前的回调",
  “版本”:“1.0”,
  “清单版本”:2,
  “权限”:[
    “贮存”
  ],
  “背景”: {
    “页面”:“背景.html”,
    “持久”:真的
  }
}

背景.js

window.addEventListener('unload', function(event) {
  localStorage.setItem("已保存", "是");
});
console.log("已保存:", localStorage.getItem('已保存'));

背景.html

<html><body></body><script src="background.js"></script></html>

要对其进行测试,请尝试禁用并重新启用或重新加载扩展程序两次。


推荐阅读