Android 允许应用程序通过Action、URI等机制调用系统内置功能,比如打电话、发邮箱、发短信等。
Windows Phone 7 也提供了类似的API提供开发人员使用,即启动器与选择器,但在Windows Phone 7 中他们是通过一套封装完整的Task 提供的。
Windows Phone 应用程序模型将每个应用分离成各自独立的沙箱,包括运行时和文件存储。微软提供的这套API只要正确的实施,启动器和选择器框架可以为最终用户提供一个完全无缝的体验,他们完全感觉不到应用程序之间的切换。那么什么是启动器?什么是选择器?这个可以用Andriod 的一些小知识来理解。
启动器 相当于Android 的Action提供一个动作,导向某个地方(功能,如发短信、打开网页、打电话等)。
选择器 相当于Android 的Uri 可以通过这个Uri 返回一串数据,在Windows Phone 7应用程序也是一样,允许你从你手机中选择一些数据比如联系人的电话号码、相册中的一张图片等。
以下是当前版本Windows Phone 7 支持的启动器和选择器的完整清单:
EmailComposeTask --允许应用程序启动电子邮件应用程序并创建一条新消息;以此来让用户从应用程序发送电子邮件。
MarketplaceDetailTask -- 允许应用程序启动Windows Phone Market 客户端应用程序并显示指定产品的详细信息页面。
MarketPlaceHubTask -- 允许应用程序启动Windows Phone Market 的客户端应用程序。
MarketPlaceReviewTask -- 允许应用程序启动Windows Phone Market 客户端应用程序并显示指定产品的评论信息页面。
MarketPlaceSearchTask -- 允许应用程序启动Windows Phone Market 客户端应用程序并显示指定搜索条件的检索结果。
----奶奶的,好多商启的API,对这块这么重视
。。。
MediaPlayerLauncher --允许应用程序启动媒体播放器。
PhoneCallTask --允许应用程序启动电话应用程序;使得用户能够在应用程序中开始打电话。
SaveEmailAddressTask -- 允许应用程序启动联系人应用程序;以此允许用户从应用程序中保存电子邮件地址到一个新的或现有的联系人。
SavePhoneNumberTask --允许应用程序启动联系人应用程序 ;以此允许用户从应用程序中保存电话号码到一个新的或现有的联系人。
SearchTask -- 允许应用程序启动WEB 搜索应用程序。
SmsComposeTask -- 允许应用程序启动Sms 应用程序。
WebBrowserTask -- 允许应用程序启动Web 浏览器应用程序。
Tip :由于本版本SDK提供的启动器和选择器API还属于Beta 版本,所以模拟器并不包括手机全部功能,故有些启动器和选择器的体验不完整。
强调一下,所有使用启动器和选择器都必须引用此命名空间:Microsoft.Phone.Tasks;
本篇学习内容,将会使用5个选择器和启动器来练习,加深到选择器和启动器的了解,下面先看一下DEMO运行效果:

点击保存联系人电话按钮,导航到:

输入一个号码,并保存,跳转到保存界面上,在这里你可以新建一个联系人或者保存到己经存在的联系人里面:

保存成功后,点击返回,我们应用程序接收到保存完成的Task 返回值,弹出提示对话框:

看看代码如何编写:
根据上面的命令清单,我们知道保存电话号码来自SavePhoneNumberTask类,故我们可以利用它来完成这个功能:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
public
partial
class
SaveContactInfoPage:PhoneApplicationPage
{
private
SavePhoneNumberTasksavePhoneNumberTask;
public
SaveContactInfoPage()
{
InitializeComponent();
savePhoneNumberTask
=
new
SavePhoneNumberTask();
//
声明一个监听,监听保存完成后的返回值
savePhoneNumberTask.Completed
+=
new
EventHandler
<
TaskEventArgs
>
(savePhoneNumberTask_Completed);
}
void
savePhoneNumberTask_Completed(
object
sender,TaskEventArgse)
{
if
(e.TaskResult
==
TaskResult.OK)
{
MessageBox.Show(
"
电话号码保存成功
"
,
"
成功
"
,MessageBoxButton.OK);
}
else
{
MessageBox.Show(
"
你电话号码:
"
+
e.Error.Message
+
"
保存失败
"
,
"
失败
"
,MessageBoxButton.OK);
}
}
//
保存命令
private
void
btnSavePhone_Click(
object
sender,RoutedEventArgse)
{
//
正则表达式验证,参数1要验证的值,参数二要验证的正则表达式,参数三处理类型
if
(Regex.IsMatch(txtInput.Text,App.phoneNumberPattern,RegexOptions.IgnoreCase))
{
if
(
null
!=
savePhoneNumberTask)
{
savePhoneNumberTask.PhoneNumber
=
txtInput.Text;
savePhoneNumberTask.Show();
txtInput.Text
=
""
;
}
else
{
MessageBox.Show(
"
你的电话号码格式错误
"
,
"
验证输入
"
,MessageBoxButton.OK);
}
}
}
}
同样的道理,我就不一一截图了,下面会提供源码,有兴趣的朋友可以尝试一下。
执行搜索命令:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
public
partial
class
SearchPage:PhoneApplicationPage
{
public
SearchPage()
{
InitializeComponent();
}
///
<summary>
///
搜索导航
///
</summary>
///
<paramname="sender"></param>
///
<paramname="e"></param>
private
void
btnSearch_Click(
object
sender,RoutedEventArgse)
{
SearchTasksearchTask
=
new
SearchTask();
searchTask.SearchQuery
=
txtInput.Text;
searchTask.Show();
}
}
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
打开浏览器代码:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
public
partial
class
BrowserWebPage:PhoneApplicationPage
{
public
BrowserWebPage()
{
InitializeComponent();
}
private
void
btnGo_Click(
object
sender,RoutedEventArgse)
{
if
(Regex.IsMatch(txtInput.Text,App.urlPattern,RegexOptions.IgnoreCase))
{
WebBrowserTaskwebBrowserTask
=
new
WebBrowserTask();
webBrowserTask.URL
=
txtInput.Text;
webBrowserTask.Show();
}
else
{
MessageBox.Show(
"
你输入的地址有误
"
,
"
错误
"
,MessageBoxButton.OK);
}
}
}
启动媒体播放器代码并播放代码:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
public
partial
class
VideoPlayerPage:PhoneApplicationPage
{
public
VideoPlayerPage()
{
InitializeComponent();
}
///
<summary>
///
该函数将使用MediaPlayerLauncher,应用程序可以通过它来启动媒体播放器
///
播放视频文件,如何用户选中“外部视频”复选框,它将播放一个基于WEB的视频流
///
否则就播放一个本地标志为“content”的视频文件。
///
</summary>
///
<paramname="sender"></param>
///
<paramname="e"></param>
private
void
btnPlayVideo_Click(
object
sender,RoutedEventArgse)
{
MediaPlayerLaunchermediaPlayerLauncher
=
new
MediaPlayerLauncher();
if
(chkUseExternalMedia.IsChecked.Value)
{
mediaPlayerLauncher.Media
=
new
Uri(
"
http://ecn.channel9.msdn.com/o9/ch9/4/1/9/7/4/5/WPMetroDesignOverivew_ch9.wmv
"
,UriKind.Absolute);
}
else
{
mediaPlayerLauncher.Location
=
MediaLocationType.Install;
mediaPlayerLauncher.Media
=
new
Uri(
"
Media/Bear.wmv
"
,UriKind.Relative);
}
mediaPlayerLauncher.Show();
}
}
注意,由于我使用的是模拟器,感觉播放视频的时候一卡一卡的,不知道在真机的效果会不会这样?
使用联系人电话号码发送短信代码:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
///
<summary>
///
感觉跟使用PhoneNumberTask差不多
///
</summary>
public
partial
class
UsePhoneNumberPage:PhoneApplicationPage
{
PhoneNumberChooserTaskphoneNumberChooserTask;
public
UsePhoneNumberPage()
{
InitializeComponent();
phoneNumberChooserTask
=
new
PhoneNumberChooserTask();
phoneNumberChooserTask.Completed
+=
new
EventHandler
<
PhoneNumberResult
>
(phoneNumberChooserTask_Completed);
}
void
phoneNumberChooserTask_Completed(
object
sender,PhoneNumberResulte)
{
if
(e.TaskResult
==
TaskResult.OK)
{
SmsComposeTasksmsComposeTask
=
new
SmsComposeTask();
smsComposeTask.Body
=
"
你好,这是Terry
"
;
smsComposeTask.To
=
e.PhoneNumber;
smsComposeTask.Show();
}
else
if
(e.TaskResult
==
TaskResult.Cancel)
{
MessageBox.Show(
"
不能发送短信
"
,
"
未选择号码
"
,MessageBoxButton.OK);
}
else
{
MessageBox.Show(
"
发送出错
"
+
e.Error.Message,
"
失败
"
,MessageBoxButton.OK);
}
}
private
void
btnSendSMS_Click(
object
sender,RoutedEventArgse)
{
phoneNumberChooserTask.Show();
}
本篇实例源码:
启动器与选择器