zoukankan      html  css  js  c++  java
  • WP8的新功能-通过一个程序来启动另一个程序

     

       Wp8对原来的WP7做了大量的优化...其中一个就包括Protocol Association,也就是通过uri来打开另外一个程序,这也就是说,我们可以做一个程序来启动另外一个程序了,如微信,QQ之类的,当然必须要有一个前提,也就是要被启动的程序必须注册一个URI关联。

       我们可以通过一个实例来说明.首先给程序注册下URI关联。

      

      选择WMAppManifest.xml点击查看代码,在Tokens后面添加Extensions属性。

        <Extensions>
          <Protocol Name="expressforwp" NavUriFragment="encodedLaunchUri=%s" TaskID="_default" />
        </Extensions>

     这时候我们就注册成功了一个Protocol,完整的代码如下。

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <Deployment xmlns="http://schemas.microsoft.com/windowsphone/2012/deployment" AppPlatformVersion="8.0">
      <DefaultLanguage xmlns="" code="zh-CN" />
      <App xmlns="" ProductID="{1eb6ffbc-41f5-4ea7-898c-206161851360}" Title="快递" RuntimeType="Silverlight" Version="1.0.0.0" Genre="apps.normal" Author="Simon Chen" Description="快递" Publisher="Simon Chen" PublisherID="{2185411b-82c2-4959-a78d-788fdefaf757}">
    
        <IconPath IsRelative="true" IsResource="false">AssetsApplicationIcon.png</IconPath>
        <Capabilities>
          <Capability Name="ID_CAP_PUSH_NOTIFICATION" />
          <Capability Name="ID_CAP_SENSORS" />
          <Capability Name="ID_CAP_WEBBROWSERCOMPONENT" />
          <Capability Name="ID_CAP_NETWORKING" />
          <Capability Name="ID_CAP_IDENTITY_DEVICE" />
          <Capability Name="ID_CAP_IDENTITY_USER" />
          <Capability Name="ID_CAP_ISV_CAMERA" />
        </Capabilities>
        <Tasks>
          <DefaultTask Name="_default" NavigationPage="View/MainPage.xaml" />
          <ExtendedTask Name="BackgroundTask">
            <BackgroundServiceAgent Specifier="ScheduledTaskAgent" Name="ExpressWP.Background" Source="ExpressWP.Background" Type="ExpressWP.Background.ScheduledAgent" />
          </ExtendedTask>
        </Tasks>
        <Tokens>
          <PrimaryToken TokenID="ExpressWPToken" TaskName="_default">
            <TemplateFlip>
              <SmallImageURI IsResource="false" IsRelative="true">AssetsTilesFlipCycleTileSmall.png</SmallImageURI>
              <Count>0</Count>
              <BackgroundImageURI IsResource="false" IsRelative="true">AssetsTilesFlipCycleTileMedium.png</BackgroundImageURI>
              <Title>快递</Title>
              <BackContent>
              </BackContent>
              <BackBackgroundImageURI>
              </BackBackgroundImageURI>
              <BackTitle>
              </BackTitle>
              <LargeBackgroundImageURI IsRelative="true" IsResource="false">AssetsTilesFlipCycleTileLarge.png</LargeBackgroundImageURI>
              <LargeBackContent />
              <LargeBackBackgroundImageURI IsRelative="true" IsResource="false">
              </LargeBackBackgroundImageURI>
              <DeviceLockImageURI>
              </DeviceLockImageURI>
              <HasLarge>True</HasLarge>
            </TemplateFlip>
          </PrimaryToken>
        </Tokens>
        <Extensions>
          <Protocol Name="expressforwp" NavUriFragment="encodedLaunchUri=%s" TaskID="_default" />
        </Extensions>
    
        <ScreenResolutions>
          <ScreenResolution Name="ID_RESOLUTION_WVGA" />
          <ScreenResolution Name="ID_RESOLUTION_WXGA" />
          <ScreenResolution Name="ID_RESOLUTION_HD720P" />
        </ScreenResolutions>
      </App>
    </Deployment>
    复制代码

       这时候我们可以在后台添加一个处理Uri的类AssociationUriMapper,代码如下

      

    复制代码
     class AssociationUriMapper : UriMapperBase
        {
            private string tempUri;
    
            public override Uri MapUri(Uri uri)
            {
                tempUri = uri.ToString();
    
                if (tempUri.Contains("expressforwp"))
                {
    
                    int tempIndex = tempUri.IndexOf("expressforwp") + 15;
                    string id = tempUri.Substring(tempIndex);
    
                    return new Uri("/View/MainPage.xaml?Code=" + id, UriKind.Relative);
                }
                return uri;
    
            }
        }
    复制代码

        再在App.xaml中应用这个Uri处理

        RootFrame.UriMapper = new AssociationUriMapper();

       好了,这样就成功注册了这个UriMapper,这时候我们可以在Mainpage的OnNavigatedTo事件中来处理请求,具体代码如下。

      

          protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
    base.OnNavigatedTo(e);
     
                if (NavigationContext.QueryString.ContainsKey("Code"))
                {
                    var code = NavigationContext.QueryString["Code"];
     
                }
            }

     好了,这样就大功告成了,我们现在可以做一个新的app来启动它,只要添加下列代码即可

      Windows.System.Launcher.LaunchUriAsync(new Uri("expressforwp:main"));

     如果要启动的app没有被安装会提示去市场搜索,如下图

      注册protocol association总的来说还是比较简单的,但是大家要注意下面几点:

    protocol的名称:自定义的 URI 方案的前缀。包含数字、小写字母、句点 (‘.’) 或连字符 (‘-’) 且长度介于 2 和 39 个字符的字符 NavUriFragment:必须始终等于 encodedLaunchUri=%s TaskID:必须始终等于 _default

         

  • 相关阅读:
    推荐几款Silverlight Tools【转载】
    Emit Vs CodeDom
    Silverlight 中实现Service同步调用
    一个配置文件的Mapping
    Silverlight:获取ContentTemplate中的命名控件
    关于计划
    巧用异步委托解决异步并发问题
    我是如何学习NodeJs的 – 笔记1
    应用HttpHandler, Json, JQuery, ASP.Net UserControl等技术处理 Ajax 的解决方案
    关于程序员的那些事一个五年程序员的总结
  • 原文地址:https://www.cnblogs.com/xiaogui9527/p/3552823.html
Copyright © 2011-2022 走看看