zoukankan      html  css  js  c++  java
  • 博客园客户端UAP开发随笔 -- 搭建App之间的桥梁

    开发Windows Phone应用的同学们应该都注意到了,Windows Phone 为了安全性,对应用的限制还是比较多的。我记得一位360的同学很无奈的说:WP太安全了,我们这些做WP上360卫士的基本上没啥可做的。但是当WP360那个App出来后,还是有很多用户安装了呢,尽管真的对安全没什么太大的帮助,但是对用户了解自己的手机的使用情况还是有帮助的。其中一位用户的评价是:从android到PC,我一直用360, 所以在WP上我也用。呵呵,粉丝啊!具体有什么用其实他也不关心铁粉而已。

    扯远了!回到这篇随笔的主题吧:我们的应用只能访问自己的文件夹以及有限的公用文件夹,而无法进入别的应用的文件夹,这就是所谓的Sandbox。那么我们如果希望调用它们呢?那也还是有方法的。

    今天我们就来介绍下app间调用的2种主要方法:

    Protocol调用

    简单的说就是用Windows.System.launcher类,通过一个形如"mailto:ms-uap@outlook.com" 这样由protocol前缀mailto,冒号,以及一个字符串组成的uri,调用注册了protocol 前缀(这里是mailto)的应用,将整个uri传给它处理的过程。

    比如这段代码:

    await Launcher.LaunchUriAsync(new Uri("mailto:ms-uap@outlook.com"));

    运行以后就会调起我们的邮件应用给ms-uap@outlook.com这个邮件账号发邮件:

    是不是很简单?

    当然,这只是调用了系统的应用。我们也可以调用注册了相应protocol前缀的第三方应用,更可以自己注册一个protocol前缀来给别的应用调用哦。

    那么如何注册呢?

    双击我们应用的Package.appxmanifest文件,在 声明 面板中选择协议,点击添加:

    一般情况下只要在名称上填写我们希望注册的protocol前缀就可以了。这个前缀最好是我们的应用专用的,比如cnbloguap。另外在Windows和Windows Phone平台上,protocol前缀是有些限制的。比如在Windows Phone上,即使我们的应用注册了 mailto 的protocol前缀,系统也依然会自动调用系统的邮件应用。详细的情况可以参见https://msdn.microsoft.com/zh-CN/library/windows/apps/xaml/hh779670。注册好protocol前缀之后我们的应用就可以被通过形如"cnbloguap:xxxx"的uri调用了。

    那么要如何处理调用我们应用的uri呢?

    这就需要我们在App.xaml.cs中override "OnActivated" 这个方法了。代码如下:

    protected async override void OnActivated(IActivatedEventArgs args)

    {

    if(args.Kind == ActivationKind.Protocol)

    {

    ProtocolActivatedEventArgs protocolArgs = args as ProtocolActivatedEventArgs;

    // TODO: Handle URI activation

    // The received URI is eventArgs.Uri.AbsoluteUri

    }

    }

    通过protocolArgs.Uri 就可以取到完整的"cnbloguap:xxxx"的uri。接下来如何处理都是随心所欲啦。

    这里需要注意的是,最好加一下"OnLaunched"方法的启动app部分的代码,不然应用处理完uri就直接退出啦。可以参考一下msdn上的例子:https://code.msdn.microsoft.com/windowsapps/Association-Launching-535d2cec/,在这个例子中将这部分代码提取成了CreateRootFrame这个方法。

    文件调用

    如果我们需要在应用间传送的信息比较多的话,protocol调用就有些不方便了。那么文件调用就能派上用场了。

    比如有这样一个场景,我们通过应用下载了一首歌myFavorite.mp3,放在了music目录,想立刻听一听。

    那么就可以在我们的代码中加入下面的片段:

    var music = await KnownFolders.MusicLibrary.GetFileAsync("myFavorite.mp3");

    await Launcher.LaunchFileAsync(music);

    系统就会自动调用音乐播放器来播放这首歌啦。不过有一点需要注意的是当播放器播放过一次这首歌以后,我们有段时间访问这个MP3文件都会报错T.T

    同protocol调用一样,我们也可以注册自己的文件类型。

    还是在Package.appxmanifest文件中的 声明 面板,选择文件类型关联,点击添加:

    填入名称和文件类型,这样系统在遇到.cnblogFile后缀的文件都会调用我们的app来处理了。当然系统还是有些保留后缀文件名的,参见https://msdn.microsoft.com/zh-CN/library/windows/apps/xaml/hh779669

    当然我们还需要得到相应的文件,这就需要在App.xaml.cs中override "OnFileActivated" 这个方法了,代码如下:

    protected override void OnFileActivated(FileActivatedEventArgs args)

    {

    foreach(StorageFile argFile in args.Files)

    {

    //处理相应文件

    }

    }

    这样我们就可以从args的Files属性中得到传给我们的文件列表,接下来可以按我们的需求处理它们。OnFileActivated 方法中也应该添加 "OnLaunched"方法的启动app部分的代码。

    在上面提到的例子https://code.msdn.microsoft.com/windowsapps/Association-Launching-535d2cec/ 中也可以看到文件调用的使用。

    不一样的调用

    LaunchFileAsync和LaunchUriAsync方法都有带LauncherOptions的重载。可以参见例子中的使用以及https://msdn.microsoft.com/zh-cn/library/windows/apps/windows.system.launcheroptions.aspx 的说明。

    分享代码,改变世界!

    Windows Phone Store App link:

    http://www.windowsphone.com/zh-cn/store/app/博客园-uap/500f08f0-5be8-4723-aff9-a397beee52fc

    Windows Store App link:

    http://apps.microsoft.com/windows/zh-cn/app/c76b99a0-9abd-4a4e-86f0-b29bfcc51059

    GitHub open source link:

    https://github.com/MS-UAP/cnblogs-UAP

    MSDN Sample Code:

    https://code.msdn.microsoft.com/CNBlogs-Client-Universal-477943ab

  • 相关阅读:
    CodeForces Gym 100935G Board Game DFS
    CodeForces 493D Vasya and Chess 简单博弈
    CodeForces Gym 100935D Enormous Carpet 快速幂取模
    CodeForces Gym 100935E Pairs
    CodeForces Gym 100935C OCR (水
    CodeForces Gym 100935B Weird Cryptography
    HDU-敌兵布阵
    HDU-Minimum Inversion Number(最小逆序数)
    七月馒头
    非常可乐
  • 原文地址:https://www.cnblogs.com/ms-uap/p/4274597.html
Copyright © 2011-2022 走看看