Dela via


Övervaka förlopp och slutförande av bakgrundsaktivitet

viktiga API:er

Lär dig hur din app kan känna igen framsteg och slutförande som rapporteras av en bakgrundsaktivitet som körs utanför processen. (För pågående bakgrundsaktiviteter kan du ange delade variabler för att ange förlopp och slutförande.)

Förlopp och slutförande av bakgrundsaktiviteter kan övervakas med appkod. För att göra det prenumererar appen på händelser från de bakgrundsaktiviteter som den har registrerat med systemet.

Skapa en händelsehanterare för att hantera slutförda bakgrundsuppgifter

Steg 1

Skapa en händelsehanterarfunktion för att hantera slutförda bakgrundsaktiviteter. Den här koden måste följa en specifik struktur som tar ett IBackgroundTaskRegistration-objekt och ett BackgroundTaskCompletedEventArgs-objekt.

Använd följande mall för metodhanteraren för bakgrundsaktivitetshändelsen OnCompleted.

private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
{
    // TODO: Add code that deals with background task completion.
}
auto completed{ [this](
        Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
        Windows::ApplicationModel::Background::BackgroundTaskCompletedEventArgs const& /* args */)
{
    // TODO: Add code that deals with background task completion.
} };
auto completed = [this](BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args)
{
    // TODO: Add code that deals with background task completion.
};

Steg 2

Lägg till kod i händelsehanteraren som hanterar slutförandet av bakgrundsaktiviteten.

Exempel på bakgrundsaktivitet uppdaterar användargränssnittet.

private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
{
    UpdateUI();
}
auto completed{ [this](
        Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
        Windows::ApplicationModel::Background::BackgroundTaskCompletedEventArgs const& /* args */)
{
    UpdateUI();
} };
auto completed = [this](BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args)
{    
    UpdateUI();
};

Skapa en händelsehanterarfunktion för att hantera bakgrundsaktivitetens förlopp

Steg 1

Skapa en händelsehanterarfunktion för att hantera slutförda bakgrundsaktiviteter. Den här koden måste följa en specifik struktur som tar in ett IBackgroundTaskRegistration-objekt och ett BackgroundTaskProgressEventArgs-objekt:

Använd följande signatur för händelsehanterarmetoden för bakgrundsuppgifter i OnProgress:

private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args)
{
    // TODO: Add code that deals with background task progress.
}
auto progress{ [this](
    Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
    Windows::ApplicationModel::Background::BackgroundTaskProgressEventArgs const& /* args */)
{
    // TODO: Add code that deals with background task progress.
} };
auto progress = [this](BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
{
    // TODO: Add code that deals with background task progress.
};

Steg 2

Lägg till kod i händelsehanteraren som hanterar slutförandet av bakgrundsaktiviteten.

Exempel på bakgrundsaktivitet uppdaterar användargränssnittet med statusen för förlopp som skickas via parametern args:

private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args)
{
    var progress = "Progress: " + args.Progress + "%";
    BackgroundTaskSample.SampleBackgroundTaskProgress = progress;
    UpdateUI();
}
auto progress{ [this](
    Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
    Windows::ApplicationModel::Background::BackgroundTaskProgressEventArgs const& args)
{
    winrt::hstring progress{ L"Progress: " + winrt::to_hstring(args.Progress()) + L"%" };
    BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
    UpdateUI();
} };
auto progress = [this](BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
{
    auto progress = "Progress: " + args->Progress + "%";
    BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
    UpdateUI();
};

Registrera händelsehanterarfunktionerna med nya och befintliga bakgrundsaktiviteter

Steg 1

När appen registrerar en bakgrundsaktivitet för första gången bör den registrera sig för att ta emot förlopps- och slutförandeuppdateringar för den, om aktiviteten körs medan appen fortfarande är aktiv i förgrunden.

Exempel på bakgrundsaktivitet anropar till exempel följande funktion för varje bakgrundsaktivitet som registreras:

private void AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration task)
{
    task.Progress += new BackgroundTaskProgressEventHandler(OnProgress);
    task.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);
}
void SampleBackgroundTask::AttachProgressAndCompletedHandlers(Windows::ApplicationModel::Background::IBackgroundTaskRegistration const& task)
{
    auto progress{ [this](
        Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
        Windows::ApplicationModel::Background::BackgroundTaskProgressEventArgs const& args)
    {
        winrt::hstring progress{ L"Progress: " + winrt::to_hstring(args.Progress()) + L"%" };
        BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
        UpdateUI();
    } };

    task.Progress(progress);

    auto completed{ [this](
        Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
        Windows::ApplicationModel::Background::BackgroundTaskCompletedEventArgs const& /* args */)
    {
        UpdateUI();
    } };

    task.Completed(completed);
}
void SampleBackgroundTask::AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration^ task)
{
    auto progress = [this](BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
    {
        auto progress = "Progress: " + args->Progress + "%";
        BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
        UpdateUI();
    };

    task->Progress += ref new BackgroundTaskProgressEventHandler(progress);

    auto completed = [this](BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args)
    {
        UpdateUI();
    };

    task->Completed += ref new BackgroundTaskCompletedEventHandler(completed);
}

Steg 2

När appen startas eller navigerar till en ny sida där status för bakgrundsaktivitet är relevant bör den hämta en lista över bakgrundsaktiviteter som för närvarande är registrerade och associera dem med förlopps- och slutförandehändelsehanterarfunktionerna. Listan över bakgrundsaktiviteter som för närvarande registreras av programmet finns i BackgroundTaskRegistration.AllTasks-egenskapen.

Exempel på bakgrundsaktivitet använder följande kod för att koppla händelsehanterare när sidan SampleBackgroundTask navigeras till:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    foreach (var task in BackgroundTaskRegistration.AllTasks)
    {
        if (task.Value.Name == BackgroundTaskSample.SampleBackgroundTaskName)
        {
            AttachProgressAndCompletedHandlers(task.Value);
            BackgroundTaskSample.UpdateBackgroundTaskStatus(BackgroundTaskSample.SampleBackgroundTaskName, true);
        }
    }

    UpdateUI();
}
void SampleBackgroundTask::OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const& /* e */)
{
    // A pointer back to the main page. This is needed if you want to call methods in MainPage such
    // as NotifyUser().
    m_rootPage = MainPage::Current;

    // Attach progress and completed handlers to any existing tasks.
    auto allTasks{ Windows::ApplicationModel::Background::BackgroundTaskRegistration::AllTasks() };

    for (auto const& task : allTasks)
    {
        if (task.Value().Name() == SampleBackgroundTaskName)
        {
            AttachProgressAndCompletedHandlers(task.Value());
            break;
        }
    }

    UpdateUI();
}
void SampleBackgroundTask::OnNavigatedTo(NavigationEventArgs^ e)
{
    // A pointer back to the main page.  This is needed if you want to call methods in MainPage such
    // as NotifyUser().
    rootPage = MainPage::Current;

    // Attach progress and completed handlers to any existing tasks.
    auto iter = BackgroundTaskRegistration::AllTasks->First();
    auto hascur = iter->HasCurrent;
    while (hascur)
    {
        auto cur = iter->Current->Value;

        if (cur->Name == SampleBackgroundTaskName)
        {
            AttachProgressAndCompletedHandlers(cur);
            break;
        }

        hascur = iter->MoveNext();
    }

    UpdateUI();
}