开发Windows Phone应用的同学们应该都注意到了,Windows Phone 为了安全性,对应用的限制还是比较多的。我记得一位360的同学很无奈的说:WP太安全了,我们这些做WP上360卫士的基本上没啥可做的。但是当WP360那个App出来后,还是有很多用户安装了呢,尽管真的对安全没什么太大的帮助,但是对用户了解自己的手机的使用情况还是有帮助的。其中一位用户的评价是:从android到PC,我一直用360, 所以在WP上我也用。呵呵,粉丝啊!具体有什么用其实他也不关心铁粉而已。
扯远了!回到这篇随笔的主题吧:我们的应用只能访问自己的文件夹以及有限的公用文件夹,而无法进入别的应用的文件夹,这就是所谓的Sandbox。那么我们如果希望调用它们呢?那也还是有方法的。
今天我们就来介绍下app间调用的2种主要方法:
简单的说就是用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