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事件處理函數 (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事件也不調用) (4)當Task執行完畢後,原有應用程式會被重新啟用。如果程式沒有被tombstoned,那麼還是會運行原有的執行個體。執行的順序是:App會觸發Activated事件; 頁面會觸發OnNavigatedTo事件。
如果應用程式被TombStone,這是會建立一個新的執行個體,執行的順序是:調用Application_Activated()函數;調用頁面的建構函式;Chooser的Completed事件處理函數;如果重載,調用OnNavigateTo()函數。 (5)是否tombstone的區別: 是否調用App和頁面的建構函式,因此程式邏輯最好不要放到建構函式,而是放到Application_Activated()和OnNavigatedTo()恢複狀態資訊。 弄清楚啟動器與選取器的執行模式還是要先搞清楚生命週期和TombStone,下面這篇文章總體講了這幾點:http://www.coolxap.com/thread-12861-1-1.html