【Win10应用开发】协议-下篇:自定义多个协议

前面介绍了如何为应用程序自定义协议,于是有朋友会问,我希望为我的应用注册多个协议,不同的协议处理不同的事情,能吗?答案是能的。

方法主要在配置清单文件上,这里我给出一个例子,示例应用将注册两个协议,分别为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

时间: 2024-08-03 10:09:07

【Win10应用开发】协议-下篇:自定义多个协议的相关文章

以蓝牙开发的视觉解读微信Airsync协议

微信硬件平台使用蓝牙作为近场控制的连接件,并拟定了<微信蓝牙外设协议>.这份协议更像一个标准,用于规范微信和蓝牙外设之间的数据交互场景和接口.但从开发者来看,要完全读懂这份协议,恐怕需要熟读很多遍,并且要结合调试才能真正实现微信Airsync通信.笔者对IOT和微信硬件平台的整个框架和技术都比较熟悉了,并且已经在TI的CC254X和Dialog的DA14580上实现了微信Airsync协议通信.现在回过头来,从开发的角度,对微信Airsync协议进行重新解读,以帮助新进入物联网领域的开发者更快

【微信公众平台开发】创建自定义菜单(四)

1.根据微信公众平台文档,得知创建自定义菜单有如下规则: a.目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单.一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以"..."代替.请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来.建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果. 注:所以最多只能创建15个功能菜单,多了就出错了! b. 目前自定义菜单接口可实现两种类型按钮,如下: click: 用户点击

Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneGap.ionic.AngularJS这些框架或库的关系,我个人理解是这样,PhoneGap是一个商业项目,用来实现HTML5式的跨平台开发,后来Adobe公司将其中的核心代码开源,就是Cordova,Cordova只负责实现JavaScript调用原生代码的功能,是一个壳,而壳里具体用什么样式,在H

Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题

原文:Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题 最近在开发一个项目时,遇到了一个奇怪的问题,项目依赖的最低版本是10586,目标版本是14393,开发完毕发布到商店后,很多用户报无法正常加载页面.经查,有问题的都是Win10 10586版本. 我上篇博客中写到的自定义的AppBar控件,也存在这个问题,10586会报错. 为此特意下载了10586的SDK调试.错误显示,一个样式找不到,名为ListViewItemBackground.因为开发的时候是基于

【Win10 应用开发】集成语音命令

原文:[Win10 应用开发]集成语音命令 记得老周以前在写WP8应用开发的文章时,曾经写过语音命令集成的文章,后来8.1的时候“小娜”问世,但考虑到其变化不大,故老周没有补写相应的文章. 今天,老周打算补一下Win 10通用应用开发中,有关语音命令集成相关的内容.虽然还是一脉相承,大的变化没有,不过Win10 sdk在语音命令定义文件中添加了新内容,而且现在不仅能在手机应用中加入语音集成,在面向PC和板子的应用中也能如愿,因为应用程序已经通用. 同理,在开始之前,老周仍然先给大家讲个故事. 话

【转】手把手教你实现自定义的应用层协议

原文: https://my.oschina.net/u/2245781/blog/1622414 报错了, 在Linux系统中,/usr/include/ 是C/C++等的头文件放置处, ------------------------------------------------------- 1.简述 互联网上充斥着各种各样的网络服务,在对外提供网络服务时,服务端和客户端需要遵循同一套数据通讯协议,才能正常的进行通讯:就好像你跟台湾人沟通用闽南语,跟广东人沟通就用粤语一样. 实现自己的应

iOS开发多线程之自定义NSOperation

iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. 1 // 2 // YYViewController.h 3 // 01-自定义Operation 4 // 5 // Created by apple on 14-6-26. 6 // Copyright (c) 2014年 itcase. All rig

iOS开发多线程篇—自定义NSOperation

iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UITableViewController. 1 // 2 // YYViewController.h 3 // 01-自定义Operation 4 // 5 // Created by apple on 14-6-26. 6 // Copyright (c) 2014年 itcase. All rig

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作)

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作) 一.简单说明 使用数据刷新框架: 该框架提供了两种刷新的方法,一个是使用block回调(存在循环引用问题,_ _weak),一个是使用调用. 问题:在进行下拉刷新之前,应该要清空之前的所有数据(在刷新数据这个方法中). 移除正在显示的cell: (1)把字典中的所有的值,都从屏幕上移除 (2)清除字典中的所有元素 (3)清除cell的frame,每个位置的cell的frame都要重新计算 (4)清除可复用的缓存池. 该部分的代码如下: 1

iOS开发UI篇—自定义瀑布流控件(基本实现)

iOS开发UI篇—自定义瀑布流控件(基本实现) 一.基本实现 说明:在View加载的时候,刷新数据. 1.实现代码 YYViewController.m文件 1 // 2 // YYViewController.m 3 // 06-瀑布流 4 // 5 // Created by apple on 14-7-28. 6 // Copyright (c) 2014年 wendingding. All rights reserved. 7 // 8 9 #import "YYViewControll