3

我阅读了有关背景音频的 msdn 概述并查看了示例应用程序,但我对消息和可以通过它们交换的数据有点困惑。

ValueSet messageDictionary = new ValueSet();
messageDictionary.Add("key", "value");
BackgroundMediaPlayer.SendMessageToBackground(messageDictionary);

新引入的带有 KeyValuePairs(string, object) 的对象 ValueSet 必须用于前台和后台任务之间的通信。
我想将自定义类的实例(假设包含媒体库的艺术家、专辑、文件路径等的音频文件)发送到后台任务。不幸的是,这是不可能的(=>异常,不支持类型) - 似乎只允许原始值。

当然,一种可能性是序列化数据。有谁知道更简单的方法,或者微软推荐的方法?

====================================
更新:
唯一可能的方法似乎是
(i)序列化数据和通过消息发送
(ii) 将数据存储在文件中并与后台任务通信以处理它们

尽管如此,我将不胜感激任何关于这个主题的建议:-)

4

2 回答 2

1

您可以在后台任务的 MessageReceivedFromForeground 处理程序中以字符串格式发送所有数据并切换键。在这里可以找到非常简单和有用的示例:http: //mark.mymonster.nl/2014/05/02/windows-phone-81ndashbackground-audio-in-windows-phone-store-apps

于 2014-05-15T20:28:17.903 回答
0

[哎呀,一年后...]

我使用的架构是您提到的两种方法和第三种方法的组合,我使用:

  • 1 序列化的通信类对象
  • 1个数据库文件
  • 很少的设置(当前曲目,以便在应用程序暂停的情况下能够恢复它)

我的前后端消息始终具有相同的结构:

  • 始终相同的钥匙;和
  • 作为通信对象的序列化的值

这个通信对象包含一个 Action Enum 值(这就是为什么不需要不同的键,这样更容易处理),并且所需的所有基本信息都包含在通信对象中它工作得很好,只要你在后台和前台之间没有太多信息要交换,序列化性能应该不是问题。它可能会被优化,但我不确定它是否值得。

通信的第二部分是一个文件,它的作用类似于播放列表的数据库,并且只能从前台写入。这允许简化发送的数据,而不会出现并发写入问题。在您的情况下,此文件将包含要播放的下一首歌曲的序列化 xml,以及所有相关信息,并且该消息将仅包含这首歌曲的 id,以便在列表中找到它。

于 2015-05-20T06:32:20.897 回答