UWP выполнить backgroundtask при входе пользователя

Я изучаю win10 uwp, и моя цель - выполнить операцию, например обновить плитку, когда пользователь входит в систему.

Я проверил на MSDN и кажется, что мне нужна BackgroundTask. Поэтому я следовал инструкциям по созданию и регистрации фоновой задачи, найденной здесь https://msdn.microsoft.com/en-us/library/windows/apps/mt299100.aspx и на связанных страницах.

BackgroundTaskBuilder taskBuilder= new BackgroundTaskBuilder();
taskBuilder.Name = "TaskClassName";
taskBuilder.TaskEntryPoint = "TaskNameSpace.TaskClassName";

// set conditions (execute when user become present)
taskBuilder.SetTrigger(new SystemTrigger(SystemTriggerType.SessionConnected, false));
taskBuilder.SetTrigger(new SystemTrigger(SystemTriggerType.UserPresent, false));

   var registration= taskBuilder.Register();

Пространство имен и класс моего BackgroundTask помещаются в отдельный проект под тем же решением и добавляются во вкладку "Объявление" Package.appxmanifest со свойством System Event выбран.

мой IBackgroundTask реализация

    public void Run(IBackgroundTaskInstance taskInstance)
    {
        BackgroundTaskDeferral deferral = taskInstance.GetDeferral();

        UpdateMyTile();

        deferral.Complete();
    }

При отладке в Visual Studio код запускает correclty и обновляет плитки, поэтому я думаю, что моя проблема в том, как я зарегистрировал задачу, а не в ее реализации.

Чтобы быть уверенным, я добавил вторую BackgroundTask в существующий проект, который вызывается на основе таймера каждые 15 минут и выполняет те же функции. Во втором случае фоновая задача регистрируется и выполняется как ожидается.

BackgroundTaskBuilder taskBuilderT= new BackgroundTaskBuilder();
taskBuilderT.Name = "TaskClassNameTimer";
taskBuilderT.TaskEntryPoint = "TaskNameSpace.TaskClassNameTimer";

taskBuilderT.SetTrigger(new TimeTrigger(15, false));

var registration= taskBuilderT.Register();

Я также пытался использовать только один SystemTrigger сначала с UserPresent а затем с SessionConnected безуспешно.

Обновление 27/01/2016

@Jakie: нет, я не использовал BackgroundExecutionManager.RequestAccessAsync(); потому что на https://msdn.microsoft.com/EN-US/library/windows/apps/windows.applicationmodel.background.systemtriggertype.aspx для SessionConnected и UserPresent говорится

Windows 10, Windows Server 2016 Technical Preview и Windows 10 Mobile: вам не нужно размещать приложение на экране блокировки, прежде чем приложение сможет успешно зарегистрировать фоновые задачи с использованием этого типа триггера.

Я собираюсь попробовать это, чтобы видеть, изменяет ли это текущее поведение. Я добавил вызов BackgroundExecutionManager.RequestAccessAsync();с использованием windows 10 диалог не отображался, но вернулся AllowedMayUseActiveRealTimeConnectivity но задача не была вызвана при входе в систему после перезагрузки.

Я запустил диагностический журнал и нашел события, относящиеся к моей фоновой задаче, он правильно зарегистрирован, но затем отменяется. В отчетах о событиях указывается eventID 19 Задача 100. Я не знаю, где искать информацию о значении этих кодов, есть предложения?

1 ответ

Решение

Мне наконец удалось успешно обновить плитку при входе пользователя. В дополнение к операциям, уже описанным в моем вопросе, я переместил метод регистрации задач в тот же проект, в котором объявлен класс фоновых задач.

Я создал класс, содержащий метод регистрации BackgroundRegistrationкласс должен быть sealed, Я объявил метод регистрации как static но это не является строго необходимым.

Я также успешно запустил мою фоновую задачу при входе в систему при запуске только тогда, когда все методы вызваны IBackgroundTask run Реализация метода была включена в проект с заданием фона, а используемые классы были sealed, Во всех других случаях я обнаружил, что моя фоновая задача всегда возвращала ошибку 0x80010008, которая в MS-ERREF описывается как:

Абонент (клиент) исчез, когда вызываемый абонент (сервер) обрабатывал вызов.

Другие вопросы по тегам