WP8.1 BackgroundMediaPlayer问题:在Foreground和Background之间发送包含数据的消息

时间:2014-05-10 13:05:29

标签: c# windows-phone-8.1 background-audio

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

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

新引入的对象ValueSet与KeyValuePairs(字符串,对象)必须用于前台和后台任务之间的通信。
我想发送自定义类的实例(比如说包含一个medialibrary的Artist,Album,Filepath等的Audiofiles)到后台任务。不幸的是,这是不可能的(=> Exception,类型不受支持) - 似乎只允许原始值。

当然,可能的是序列化数据。有没有人知道更简单的方法,或微软的推荐方式?

====================================
更新:
只有可能的方式似乎
(i)序列化数据并通过消息发送
(ii)将数据存储在文件中并传达后台任务以处理它们

尽管如此,我对此主题的任何建议表示感谢: - )

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

[哎呀1年后......]

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

  • 1序列化通信类对象
  • 1个数据库文件
  • 几个设置(当前曲目,能够在暂停应用时恢复)

我的前后消息总是具有相同的结构:

  • 一把永远相同的钥匙;和
  • 作为通信对象序列化的值

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

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