豆瓣电台 for windows phone 7.5开发笔记
暑假来深圳实习终于有了点闲钱买了台HD7,一直就想抽空把PC上的豆瓣电台移动到Windows Phone上,但是总抽不出时间。国庆的时候放假7天,抽了3天的尝试了移植,初步能够实现大部分功能了。很欣慰的是之前的DoubanAPI只在网络通信部分改动了一些细节,几乎不费任何力气就移植到了WP7上。在开发期间,主要的瓶颈在于后台播放模块,也就是7.1 SDK里新增加的Background Audio Agent类,因此在这里总结一下。
Windows Phone 7.5的Background Audio Agent在我的理解非常类似于Win32窗体的消息回调函数。函数是由开发者自己设计的,但是却不能由开发者的程序调用。两部分代码属于不同的进程(静态类成员不能被共享访问),因为在两部分代码间共享数据就成了最大的问题。起初我是考虑使用独立存储进行通信,但是却不知道为什么总是会出现一边已经只保存了数据,但是另外一边读出来还是旧的数据的情况。后来考虑的方法是利用BackgroundAudioPlayer.Instance静态对象里的Tag属性在两部分代码间传递数据。BackgroundAudioPlayer.Instance是BackgroundAudio Service里最重要的一个对象,一个系统同时只能有一个BackgroundAudio的实例,如果两个应用的都使用了后台播放服务,后启动的就会把之前的一个覆盖掉。
关于Tag共享部分的代码如下
public static void ChangeTrackTag(int TagIndex, string NewTag)
{
if (BackgroundAudioPlayer.Instance.Track == null)
{
BackgroundAudioPlayer.Instance.Track = new AudioTrack(
new Uri("http://douban.fm"),
"",
"",
"",
null,
"|||||",
EnabledPlayerControls.Pause | EnabledPlayerControls.SkipNext
);
}
string[] Tags = BackgroundAudioPlayer.Instance.Track.Tag.Split('|');
Tags[TagIndex] = NewTag;
for (int i = 0; i < Tags.Length - 1; ++i)
{
Tags[i] += "|";
}
AudioTrack at = BackgroundAudioPlayer.Instance.Track;
BackgroundAudioPlayer.Instance.Track = new AudioTrack(
new Uri("http://douban.fm"),
at.Title,
at.Artist,
at.Album,
at.AlbumArt,
string.Concat(Tags),
EnabledPlayerControls.Pause | EnabledPlayerControls.SkipNext
);
}
public static string GetTrackTag(int TagIndex)
{
if (BackgroundAudioPlayer.Instance.Track == null)
return "";
try
{
return BackgroundAudioPlayer.Instance.Track.Tag.Split('|')[TagIndex];
}
catch
{
return "";
}
}
目前的代码里是利用这样的方法实现两部分代码数据交换,今天求教了一高人,回复说用MVVM可以完
相关新闻>>
- 发表评论
-
- 最新评论 更多>>