Windows Phone应用程序执行模型决定了每个应用程序只能在自己的沙箱(Sandbox)里面运行。他不可以直接访问其他存储信息,比如联系人的信息;也不可以直接调用其他功能,比如电话、拍照等。
这样如果我们要调用其他的功能或者访问其他的存储信息时,我们就需要用到启动器和选择器,它们为应用程序提供间接访问这些内置功能的方法。
还有个要注意的是启动器和选择器运行时操作系统可能会终止当前的应用程序。
1、启动器
启动器相当于Android 的Action提供一个动作,导向某个地方(功能,如发短信、打开网页、打电话等)。要注意的是启动器会启动一个内置功能给用户,但是不会返回任何数据给调用的程序。有人将启动器描述为一个“触发并忘记”的机制,它仅仅是触发而不会给调用的程序任何数据。
常用的启动器:
- EmailComposeTask–允许用户通过邮件账户发送电子邮件。
- MarketplaceDetailTask–启动Windows Phone Marketplace,让用户查看某个特定的产品。
- MarketplaceHubTask–启动Windows Phone Marketplace,默认情况下允许你显示某一类别的应用程序。
- MarketplaceReviewTask–将用户带到Windows Phone Marketplace中当前程序的评论页。
- MarketplaceSearchTask–启动Windows Phone Marketplace的搜索结果,此结果来源于用户输入的搜索项(或者是你来制定的)。
- MediaPlayerLauncher–启动内置的媒体播放器,并播放你指定的媒体文件。
- PhoneCallTask–启动电话程序并显示电话号码和姓名。电话只在用户点击“通话”后才会拨出。
- SearchTask– 可以把这个看成是在你的程序中提供Bing搜索功能的途径。
- SMSComposeTask –启动信息程序并向用户展示发送信息的功能。你可以指定信息接收人和信息内容,但只能通过用户来发送。
- WebBrowserTask–打开网络浏览器,跳转到指定的URL。
上面这些是常用的启动器,每个启动器的名字都链接到msdn的相应节中,那里有详细的例子。
如果要看所有的启动器,可以到这里去查看:
http://msdn.microsoft.com/zh-cn/library/ff769550(v=vs.92).aspx。
2、选择器
选择器相当于Android 的Uri 可以通过这个Uri 返回一串数据,在Windows Phone 7应用程序也是一样,允许你从你手机中选择一些数据比如联系人的电话号码、相册中的一张图片等。
选择器首先启动了一个内置的程序给用户使用,然后返回一些数据给调用的程序,当用户完成操作时,调用程序会被重新激活,并接收到返回的数据。
注意:用户可能取消操作,这样返回的数据即为null。
常用的选择器:
- CameraCaptureTask – 为用户提供在程序中直接拍照的功能。
- EmailAddressChooserTask – 在程序中允许用户从联系人里面选择一个邮件地址。
- PhoneNumberChooserTask – 在程序中允许用户从联系人里面选择一个电话号码。
- PhotoChooserTask – 在程序中允许用户从设备里选择一张照片。
同启动器一样,每个选择器都加了链接,要看所有的选择器请见:
http://msdn.microsoft.com/zh-cn/library/ff769543(v=vs.92).aspx。
选择器的使用要比启动器复杂,
一般的步骤为:
(1)在PhoneApplicationPage类里面定义一个Chooser的实例的field
(2)在PhoneApplicationPage的构造函数生成该Chooser的实例,同时注册Completed事件处理函数
(2)在PhoneApplicationPage的构造函数生成该Chooser的实例,同时注册Completed事件处理函数
(3)实现Completed事件处理函数
(4)调用Show()方法启动选择器
模拟器并不是支持所有的启动器和选择器的,具体的情况见
http://preview.library.microsoft.com/en-us/library/ff955600(v=VS.92).aspx,我就不复制粘贴了。
3、启动器和模拟器的运行模式
(1)当启动启动器或者选择器的时候,应用程序会进入失去激活状态
页面触发OnNavigatedFrom事件,App触发Deactived事件,启动的内置程序(Task)会接管当前的控制权。
(2)当Task运行的时候,应用程序
可能tombstoned,也
可能没有。
当运行一些特定的Task时,应用程序没有被TombStone(我个人理解就是7.1中的休眠模式),调用结束后,参数传递给
原有的应用程序的实例。但是如果用户运行被调用的Task过程中导航到其他的应用程序,那么调用程序还是会被TombStone。
(3)可能没有tombstone的Tasks
CameraCaptureTask
PhotoChooserTask
MediaPlayeLauncher
EmailAddressChooserTask
PhoneNumberChooserTask
PhoneCallTask(连Deactived事件也不调用)
PhotoChooserTask
MediaPlayeLauncher
EmailAddressChooserTask
PhoneNumberChooserTask
PhoneCallTask(连Deactived事件也不调用)
(4)当Task执行完毕后,原有应用程序会被重新激活。如果程序没有被tombstoned,那么还是会运行原有的实例。执行的顺序是:App会触发Activated事件; 页面会触发OnNavigatedTo事件。
如果应用程序被TombStone,这是会创建一个新的实例,执行的顺序是:调用Application_Activated()函数;调用页面的构造函数;Chooser的Completed事件处理函数;如果重载,调用OnNavigateTo()函数。
如果应用程序被TombStone,这是会创建一个新的实例,执行的顺序是:调用Application_Activated()函数;调用页面的构造函数;Chooser的Completed事件处理函数;如果重载,调用OnNavigateTo()函数。
(5)是否tombstone的区别: 是否调用App和页面的构造函数,因此程序逻辑最好不要放到构造函数,而是放到Application_Activated()和OnNavigatedTo()恢复状态信息。
弄清楚启动器与选择器的执行模式还是要先搞清楚生命周期和TombStone,下面这篇文章总体讲了这几点:
http://www.coolxap.com/thread-12861-1-1.html