前面介紹了如何為應用程式自定義協定,于是有朋友會問,我希望為我的應用注冊多個協定,不同的協定處理不同的事情,能嗎?答案是能的。
方法主要在配置清單檔案上,這裡我給出一個例子,示例應用将注冊兩個協定,分别為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);
測試結果如下圖所示。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL2gTO1YjM2kTNzEDOxQDMvwVNwUTMwIzLclDOzcjNz8CX1EDMyc2bsJ2Lc12bj5ycn9Gbi52YuAzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
注意,在使用協定時,協定名稱後面一定要加上冒号(英文),如music:。
示例下載下傳位址:https://files.cnblogs.com/files/tcjiaan/protocol-part2.zip