前面介紹了如何為應用程序自定義協議,於是有朋友會問,我希望為我的應用注冊多個協議,不同的協議處理不同的事情,能嗎?答案是能的。
方法主要在配置清單文件上,這里我給出一個例子,示例應用將注冊兩個協議,分別為music:和video:。
在清單文件中找到Package/Applications/Application節點,在Application元素下增加Extensions節點,表示為應用程序聲明的擴展,可以包含N個uap:Extension元素,一定要加上uap前綴,表明是用於通用應用的。正是利用了uap:Extension元素這個特點,可以為應用程序定義多個協議,但是,一定要記住:一個uap:Extension元素只能聲明一個協議。
既然要多個協議,那就定義多個uap:Extension元素,如本例的清單文件定義如下:
<Extensions> <uap:Extension Category="windows.protocol"> <uap:Protocol Name="music"/> </uap:Extension> <uap:Extension Category="windows.protocol"> <uap:Protocol Name="video"/> </uap:Extension> </Extensions>
Protocol元素的Name特性指定協議的名字。
接下來在App類中重寫OnActivated方法,主要是從參數中取出激活應用程序的URI,再判斷應用程序是被哪個協議激活的。
protected override void OnActivated(IActivatedEventArgs args) { if (args.Kind == ActivationKind.Protocol) { ProtocolActivatedEventArgs parg = (ProtocolActivatedEventArgs)args; Uri uri = parg.Uri; string data = null; // 判斷是哪個協議激活 switch (uri.Scheme) { case "music": data = "音樂"; break; case "video": data = "視頻"; break; default: data = null; break; } // 顯示頁面 Frame rootframe = Window.Current.Content as Frame; if (rootframe == null) { rootframe = new Frame(); Window.Current.Content = rootframe; } rootframe.Navigate(typeof(MainPage), data); } Window.Current.Activate(); }
args.Kind的值很關鍵,因為應用程序可能被其他方式激活,如文件關聯,所以這里必須判斷。取得URI后,Scheme屬性可以得到URI的架構名,即協議的名字,如上面定義的music、video。進而判斷哪個協議激活了應用。
下面再寫一個示例應用,用來通過協議激活上面的應用,在代碼中可以用Launcher類的LaunchUriAsync方法來啟動一個URI。
Uri uri = new Uri(txt1.Text); await Windows.System.Launcher.LaunchUriAsync(uri);
測試結果如下圖所示。

注意,在使用協議時,協議名稱后面一定要加上冒號(英文),如music:。
示例下載地址:http://files.cnblogs.com/files/tcjiaan/protocol-part2.zip
