豆瓣电台 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("https://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("https://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可以完美解决这个问题。看来又要花时间看资料了,不过这段时间工作太忙,暂时不会再update,像以前的code一样烂尾算了。
本来打算把代码放到google code的平台上,但是貌似这几天gfw抽风,怎么commit都失败,所以直接打包放下载里了,有兴趣的同学可以去下载一下。有什么好的解决上面问题的方法也不吝赐教,谢谢。
之是之前发在智机网上的版本:https://www.wpxap.com/thread-173201-1-1.html
google code:https://code.google.com/p/lemanz-douban-radio/downloads/detail?name=douban_wp.7z&can=2&q=#makechanges
摘自 博比的杂货间
推荐阅读
-
Windows Phone 7 开发探索笔记5——页面间导航
-
Windows Phone 7 开发探索笔记3——触控操作之GestureListener
-
Windows Phone 7 开发探索笔记4——触控操作之XNA中的Gesture
-
Windows Phone 7 开发探索笔记7——加载XML文件
-
Windows Phone 7 开发探索笔记2——触控操作之Manipulation
-
Windows Phone 7 开发探索笔记6——页面间传值
-
Windows Phone 7 开发探索笔记1——触控操作之Touch
-
豆瓣电台 for windows phone 7.5开发笔记
-
Windows Phone 7 开发探索笔记9——菜单栏
-
Windows Phone 7 开发探索笔记8——加载XAML文件中的对象