5

Google Chrome 拡張アラームを使用している場合、アラームが設定されている場合はアラームが鳴り、アラームの時間が経過すると Chrome が閉じられ、再度開かれます。

どうすればこれを止めることができますか?

これは、私が何を意味するかを説明するための小さなコード サンプルです。

/* 
If we perform Browser Action to create alarm, then 
close the browser, wait about 2 minutes for the alarm to expire
and then reopen the browser, the alarm will go off and the DoSomething 
function will get called twice, once by the onStartup event and once
by the onAlarm event.
*/
chrome.browserAction.onClicked.addListener(function (tab) {
    chrome.alarms.create('myAlarm', {
        delayInMinutes : 2.0
    });
});

chrome.alarms.onAlarm.addListener(function (alarm) {
    console.log('Fired alarm!');
    if (alarm.name == 'myAlarm') {
        createListener();
    }
});

chrome.runtime.onStartup.addListener(function () {
    console.log('Extension started up...');
    DoSomething();
});

function DoSomething() {
    alert('Function executed!');
}

したがって、私のコード サンプルの上部にあるコメントを読めば、何が起こるかがわかります。

私が欲しいのは、ブラウザが起動されたばかりの場合にイベントDoSomethingによってのみ機能が実行されるように、ブラウザが閉じられた場合にアラームがクリアされ、ブラウザが起動された後にのみアラームが機能を実行できるようにすることです。私のコードは新しいアラームを作成します。onStartupDoSomething

ブラウザを閉じた後もアラームが鳴り続けonAlarmて、ブラウザが再度開いたときに実行されることは決してありません。

どうすればこれを達成できますか?

4

1 に答える 1

9

ブラウザを閉じたときにChrome拡張機能がコードを確実に実行することはできません。

シャットダウン時にクリーンアップするのではなく、起動時に古いアラームが実行されないようにしてください。これは、(セッションに対して)一意の識別子を生成することで実現できます。

イベントページを使用している場合は、識別子をに保存します(マニフェストファイルで権限chrome.storage.localを設定することを忘れないでください)。storageそれ以外の場合は、グローバルスコープに格納します。

// ID generation:
chrome.runtime.onStartup.addListener(function () {
    console.log('Extension started up...');
    chrome.storage.local.set({
        alarm_suffix: Date.now()
    }, function() {
        // Initialize your extension, e.g. create browser action handler
        // and bind alarm listener
        doSomething();
    });
});

// Alarm setter:
chrome.storage.local.get('alarm_suffix', function(items) {
    chrome.alarms.create('myAlarm' + items.alarm_suffix, {
        delayInMinutes : 2.0
    });
});

// Bind alarm listener. Note: this must happen *after* the unique ID has been set
chrome.alarms.onAlarm.addListener(function(alarm) {
    var parsedName = alarm.name.match(/^([\S\s]*?)(\d+)$/);
    if (parsedName) {
        alarm.name = parsedName[0];
        alarm.suffix = +parsedName[1];
    }
    if (alarm.name == 'myAlarm') {
        chrome.storage.local.get('alarm_suffix', function(data) {
            if (data.alarm_suffix === alarm.suffix) {
                doSomething();
            }
        });
    }
});

イベントページを使用せず、通常のバックグラウンドページを使用している場合は、変数をグローバルに保存するだけです(利点:IDの読み取り/書き込みが同期されるため、必要なコードが少なくなります)。

chrome.runtime.onStartup.addListener(function () {
    window.alarm_suffix = Date.now();
});
chrome.alarms.create('myAlarm' + window.alarm_suffix, {
    delayInMinutes : 2.0
});
chrome.alarms.onAlarm.addListener(function(alarm) {
    var parsedName = alarm.name.match(/^([\S\s]*?)(\d+)$/);
    if (parsedName) {
        alarm.name = parsedName[0];
        alarm.suffix = +parsedName[1];
    }
    if (alarm.name == 'myAlarm') {
        if (alarm.suffix === window.alarm_suffix) {
            doSomething();
        }
    }
});

または、古き良きものを使用して、setTimeout副作用なしで同じ目標を達成します。

setTimeout(function() {
    doSomething();
}, 2*60*1000); // 2 minutes
于 2012-12-31T13:48:20.020 に答える