瞭解如何使用 TimeTrigger 來排程一次性背景工作,或執行定期背景工作。
請參閱 背景啟用範例 中的 Scenario4,以查看如何實作本主題中所述的時間觸發背景工作範例。
本主題假設您有背景工作需要定期執行,或在特定時間執行。 如果您還沒有背景工作,在 BackgroundActivity.cs中有一個背景工作的範例。 或者,請遵循 中建立和註冊進程內背景工作的步驟 或 建立和註冊跨進程背景工作 的步驟來建立。
建立時間觸發器
建立新的 TimeTrigger。 第二個參數 OneShot,指定背景工作只會執行一次或定期執行。 如果 OneShot 設定為 true,則第一個參數(FreshnessTime)會指定安排背景工作之前等候的時間,以分鐘為單位。 如果 OneShot 設定為 false,則 FreshnessTime 會指定背景工作執行的頻率。
以桌面或行動裝置系列為目標的通用 Windows 平臺 (UWP) app 內建定時器會以 15 分鐘間隔執行背景工作。 (定時器每隔 15 分鐘執行一次,讓系統只需要每隔 15 分鐘喚醒一次,才能喚醒要求 TimerTriggers 的應用程式,以節省電源。
如果 FreshnessTime 設定為 15 分鐘,且 OneShot 為真,則工作將會排定在註冊後 15 到 30 分鐘之間開始執行一次。 如果設為 25 分鐘,且 OneShot 為 true,工作將會被排程於註冊後的 25 到 40 分鐘內開始執行。
如果 FreshnessTime 設定為 15 分鐘,且 OneShot 為 false,則工作將會在註冊時間的 15 到 30 分鐘之間開始,每隔 15 分鐘執行一次。 如果設定為 n 分鐘,且 OneShot 為 false,則工作將會在註冊後 n 到 n + 15 分鐘之間開始,之後每隔 n 分鐘執行一次。
備註
如果 FreshnessTime 設定為小於 15 分鐘,則嘗試註冊背景工作時會引發例外狀況。
例如,此觸發程式會使得背景任務每小時執行一次。
TimeTrigger hourlyTrigger = new TimeTrigger(60, false);
Windows::ApplicationModel::Background::TimeTrigger hourlyTrigger{ 60, false };
TimeTrigger ^ hourlyTrigger = ref new TimeTrigger(60, false);
(選擇性)新增條件
您可以建立背景工作條件,以控制工作何時執行。 條件會阻止背景工作執行,直到該條件被滿足為止。 如需詳細資訊,請參閱 設定執行背景工作的條件。
在此範例中,條件會設定為 UserPresent,如此一旦觸發,工作只會在使用者啟動時執行。 如需可能條件的清單,請參閱 SystemConditionType。
SystemCondition userCondition = new SystemCondition(SystemConditionType.UserPresent);
Windows::ApplicationModel::Background::SystemCondition userCondition{
Windows::ApplicationModel::Background::SystemConditionType::UserPresent };
SystemCondition ^ userCondition = ref new SystemCondition(SystemConditionType::UserPresent);
如需有關背景觸發事件的條件和類型的詳細資訊,請參閱 利用背景工作支援您的應用程式。
呼叫 RequestAccessAsync()
註冊 ApplicationTrigger 背景工作之前,請呼叫 RequestAccessAsync,以判斷用戶允許的背景活動層級,因為使用者可能已停用您 app 的背景活動。 如需使用者控制背景活動設定的方式詳細資訊,請參閱 優化背景活動。
var requestStatus = await Windows.ApplicationModel.Background.BackgroundExecutionManager.RequestAccessAsync();
if (requestStatus != BackgroundAccessStatus.AlwaysAllowed)
{
// Depending on the value of requestStatus, provide an appropriate response
// such as notifying the user which functionality won't work as expected
}
註冊背景任務
要註冊背景工作,請呼叫背景工作註冊函式。 如需註冊背景工作的詳細資訊,以及請參閱下列範例程序代碼中的 RegisterBackgroundTask() 方法的定義,請參閱 註冊背景工作。
這很重要
針對在與應用程式相同的進程中執行的背景工作,請勿設定 entryPoint。 針對在與應用程式不同的進程中執行的背景工作,請將 entryPoint 設定為命名空間 『.』,以及包含背景工作實作的類別名稱。
string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName = "Example hourly background task";
BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example hourly background task" };
Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName = "Example hourly background task";
BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
背景工作註冊參數會在註冊時進行驗證。 如果任何註冊參數無效,則會傳回錯誤。 請確保您的應用程式能夠流暢地處理背景工作註冊失敗的情況。如果您的應用程序在嘗試註冊工作後仍依賴於有效的註冊物件,則可能會發生當機。
管理背景任務的資源
使用 BackgroundExecutionManager.RequestAccessAsync 來判斷使用者是否已決定您的應用程式背景活動應受到限制。 請注意您的電池使用量,且只有在需要完成使用者想要的動作時,才會在背景中執行。 如需使用者控制背景活動設定的方式詳細資訊,請參閱 優化背景活動。
- 記憶體:調整應用程式的記憶體和能源使用是確保操作系統允許背景工作執行的關鍵。 使用 記憶體管理 API 來查看背景工作所使用的記憶體存量。 背景工作所使用的記憶體越多,當另一個應用程式處於前景時,OS 就越難讓它繼續執行。 用戶最終會控制應用程式可執行的所有背景活動,並能看見應用程式對電池使用的影響。
- CPU 時間:背景工作受限於根據觸發程式類型取得的時鐘使用時間量。
如需了解套用至背景工作的資源限制,請參閱 使用背景工作來支援您的應用程式。
備註
從 Windows 10 開始,使用者不再需要將您的應用程式新增至鎖定畫面,才能利用背景工作。
如果您先呼叫 RequestAccessAsync,背景工作才會使用 TimeTrigger 執行。