替わる質問タイトル:イベントページがアンロードされないようにするにはどうすればよいですか?オンデマンドで永続的なバックグラウンドページを作成するには? (Google Chrome拡張機能)
タイマーのように動作する拡張機能を構築したいと思います。起動時に秒数をカウントダウンする必要がありますが、非アクティブで何もしないでください。
chrome.alarms
APIは面白いですが、十分な精度や細かさがありません。たった1分に1回しか発火せず、遅く発火する可能性があります。それより頻繁に実行するものが必要な場合は、このAPIを使用できません。
次に、次の自然な解決策は、background pageを使用し、そこにsetTimeout
またはsetInterval
を使用することです。しかし、バックグラウンドページは永続的であり、アイドル状態であってもリソース(例えば、メモリ)を占有する。だから彼らは理想的ではありません。
最も良い解決策は、タイマーを実行するevent pageのようです。しかし、ドキュメントは言う:
それがロードされると、イベントページは、(例えば、拡張APIを呼び出すか、ネットワーク要求を発行する)有効であるとして実行されているままになります。
[...]
イベントページが短時間(数秒)アイドル状態になっていたら、runtime.onSuspendイベントが送出されます。イベントページは強制的にアンロードされる前にこのイベントを処理するのに数秒間あります。
[...]
あなたの拡張子が
window.setTimeout()
またはwindow.setInterval()
を使用している場合は、代わりに、アラームのAPIを使用するように切り替えます。イベントページがシャットダウンされると、DOMベースのタイマーは尊重されません。
残念ながら、アクティブなsetInterval
を持つことは、イベントページをアクティブにすると考えるには不十分です。事実、私のテストでは、10秒までの間隔でイベントページを実行するのに十分な時間がありますが、10秒または15秒を超える間隔は離れすぎてイベントページがアンロードされます。私はこれをmy crx-reload-tab projectでテストしました。私は私が何をしたいと考えてい
は妥協点です:
- 私はロードし、需要にアンロードすることができた背景ページをしたいです。 (常にロードされ続けるものの代わりに)
- 私がと言う限り、永続的なメモリにとどまるイベントページが必要です。それ以外の場合はアンロードできます。 (ブラウザによって自動的にアンロードされるものの代わりに)
可能ですか?どうしたらいいですか?
「ポート」を開いたままにしようとしましたが、他のコンテキストが開いていないことを覚えています。そのため、イベントページをアクティブに保つだけでは不十分です。私たちはどちらも、イベントページをアクティブに保つために短いタイムアウト/間隔を保つという回避策/解決策に同意したようです。 A *希薄なビジー待機ループ*、あなたがそれを呼んだとき。ありがとう! –