WP8.1 BackgroundMediaPlayer Проблема: отправка сообщений с данными между Foreground и Background
Я прочитал обзор MSDN о фоновом аудио и взглянул на пример приложения, но меня немного смущают сообщения и данные, которыми можно обмениваться через них.
ValueSet messageDictionary = new ValueSet();
messageDictionary.Add("key", "value");
BackgroundMediaPlayer.SendMessageToBackground(messageDictionary);
Новый введенный объект ValueSet с KeyValuePairs(строка, объект) должен использоваться для связи между передним планом и фоновой задачей.
Я хотел бы отправить экземпляры пользовательских классов (скажем, аудиофайлы, содержащие Artist, Album, Filepath и т. Д. Медиальной библиотеки) для фоновой задачи. К сожалению, это невозможно (=> Исключение, тип не поддерживается) - кажется, что допускаются только примитивные значения.
Конечно, существует возможность сериализации данных. Кто-нибудь знает более легкий путь или рекомендуемый Microsoft путь?
====================================
ОБНОВИТЬ:
Единственно возможный путь кажется
(i) сериализовать данные и отправить их через сообщения
(ii) сохранить данные в файле и передать фоновую задачу для их обработки
тем не менее, буду благодарен за любые рекомендации по этой теме:-)
2 ответа
Вы можете отправить все данные в строковом формате и переключать ключи в обработчике MessageReceivedFromForeground в фоновой задаче. Очень простой и полезный пример можно найти здесь: http://mark.mymonster.nl/2014/05/02/windows-phone-81ndashbackground-audio-in-windows-phone-store-apps
[Упс 1 год спустя...]
Архитектура, которую я использую, представляет собой комбинацию двух упомянутых вами методов и третьего, который я использую:
- 1 сериализованный объект класса связи
- 1 файл базы данных
- Несколько настроек (текущий трек, чтобы иметь возможность возобновить его в случае приостановки приложения)
Мои предварительные сообщения всегда имеют одинаковую структуру:
- ключ, который всегда один и тот же; а также
- значение, которое является сериализацией объекта связи
Этот коммуникационный объект включает в себя значение Action Enum (поэтому нет необходимости в разных ключах, так проще обрабатывать), и вся необходимая базовая информация содержится в коммуникационном объекте. Он работает довольно хорошо, пока вы не так много информации для обмена между задним и задним планом, производительность сериализации не должна быть проблемой. Вероятно, это можно оптимизировать, но я не уверен, что оно того стоит.
Вторая часть сообщения - это файл, который работает как база данных для списка воспроизведения и записывается только с переднего плана. Это позволяет упростить отправленные данные без одновременных проблем с записью. В вашем случае этот файл будет содержать сериализованный XML следующих песен для воспроизведения со всей необходимой информацией, а сообщение будет содержать только идентификатор этой песни, чтобы найти его в списке.