從您的應用程式觸發背景工作
了解如何使用 ApplicationTrigger 從您的應用程式啟動背景工作。
如需建立應用程式觸發程序的範例,請參閱此範例。
本主題假設您有想要從應用程式啟動的背景工作。 如果您還沒有背景工作,BackgroundActivity.cs 會有一個範例背景工作。 或者,請遵循建立和註冊跨處理序的背景工作中的步驟來建立工作。
為何使用應用程式觸發程序
使用 ApplicationTrigger 在與前景應用程式不同的處理序中執行程式碼。 如果您的應用程式有需要在背景中完成的工作,則 ApplicationTrigger 是適當的,即使使用者關閉前景應用程式也一樣。 如果背景工作應該在應用程式關閉時停止,或應該繫結至前景處理序的狀態,則應該改用延長執行。
建立應用程式觸發程序
建立新的ApplicationTrigger。 您可以將它儲存在欄位,如下列程式碼片段所示。 為了方便起見,我們稍後不需要在發出觸發程序訊號時建立新的執行個體。 但是您可以使用任何 ApplicationTrigger 執行個體來發出觸發程序的訊號。
// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
_AppTrigger = new ApplicationTrigger();
// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
Windows::ApplicationModel::Background::ApplicationTrigger _AppTrigger;
// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
ApplicationTrigger ^ _AppTrigger = ref new ApplicationTrigger();
(選擇性) 新增條件
您可以建立背景工作條件,以控制工作何時執行。 條件可避免背景工作執行,直到符合條件為止。 如需詳細資訊,請參閱設定執行背景工作的條件。
在此範例中,條件會設定為 InternetAvailable,這樣一來,一旦觸發條件,工作只有在網際網路連線可用時才會執行。 如需可能條件的清單,請參閱 SystemConditionType。
SystemCondition internetCondition = new SystemCondition(SystemConditionType.InternetAvailable);
Windows::ApplicationModel::Background::SystemCondition internetCondition{
Windows::ApplicationModel::Background::SystemConditionType::InternetAvailable };
SystemCondition ^ internetCondition = ref new SystemCondition(SystemConditionType::InternetAvailable)
如需有關背景觸發程序之條件和類型的詳細資訊,請參閱使用背景工作支援應用程式。
呼叫 RequestAccessAsync()
註冊 ApplicationTrigger 背景工作之前,請呼叫 RequestAccessAsync 來判斷使用者允許的背景活動層級,因為使用者可能已停用應用程式的背景活動。 如需使用者控制背景活動設定方式的詳細資訊,請參閱最佳化背景活動。
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() 方法的定義,請參閱註冊背景工作。
如果您要考慮使用應用程式觸發程序來延長前景處理序的存留期,請考慮改用延長執行。 應用程式觸發程序是專為建立個別裝載的處理序所設計,以便執行工作。 下列程式碼片段會註冊跨處理序背景觸發程序。
string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName = "Example application trigger";
BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example application trigger" };
Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName = "Example application trigger";
BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition);
註冊時會驗證背景工作註冊參數。 如果任何註冊參數無效,則會傳回錯誤。 請確定您的應用程式可正常處理背景工作註冊失敗的案例,如果您的應用程式在嘗試註冊工作之後依賴有效的註冊物件,它可能會當機。
觸發程序背景工作
觸發背景工作之前,請使用 BackgroundTaskRegistration 來確認背景工作已註冊。 應用程式啟動期間是確認所有背景工作都已註冊的好時機。
呼叫 ApplicationTrigger.RequestAsync 以觸發背景工作。 任何 ApplicationTrigger 執行個體都會可以做到。
請注意, ApplicationTrigger.RequestAsync 無法從背景工作本身呼叫,或當應用程式處於背景執行狀態時 (如需應用程式狀態的詳細資訊,請參閱應用程式生命週期)。 如果使用者已設定防止應用程式執行背景活動的能源或隱私策略,它可能會傳回 DisabledByPolicy。 此外,一次只能執行一個 AppTrigger。 如果您嘗試在另一個 AppTrigger 正在執行時執行 AppTrigger,函式會傳回 CurrentlyRunning。
var result = await _AppTrigger.RequestAsync();
管理背景工作的資源
使用 BackgroundExecutionManager.RequestAccessAsync 來判斷使用者是否已決定您的應用程式背景活動應受到限制。 請注意您的電池使用量,且只有在需要完成使用者想要的動作時,才會在背景中執行。 如需使用者控制背景活動設定方式的詳細資訊,請參閱最佳化背景活動。
- 記憶體:調整應用程式的記憶體和使用電量是確保作業系統允許背景工作執行的關鍵。 使用記憶體管理 API 來查看背景工作所使用的記憶體存量。 背景工作所使用的記憶體越多,當另一個應用程式處於前景時,作業系統就越難讓它繼續執行。 使用者最終會控制應用程式可執行的所有背景活動,並能看見應用程式對電池使用電量的影響。
- CPU 時間:背景工作受限於根據觸發程序類型取得的實際時間使用量。 應用程式觸發程序所觸發的背景工作限制大約為 10 分鐘。
如需套用至背景工作的資源限制,請參閱使用背景工作 支援應用程式。
備註
從 Windows 10 開始,使用者不再需要將您的應用程式新增至鎖定畫面,才能利用背景工作。
如果您先呼叫 RequestAccessAsync,背景工作才會使用 ApplicationTrigger 執行。