专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > WinRT Metro

博客园客户端UAP开发漫笔 - 搭建App之间的桥梁

发布时间:2011-06-23 13:56:24 文章来源:www.iduyao.cn 采编人员:星星草
博客园客户端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

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: