標籤:
開發Windows Phone應用的同學們應該都注意到了,Windows Phone 為了安全性,對應用的限制還是比較多的。我記得一位360的同學很無奈的說:WP太安全了,我們這些做WP上360衛士的基本上沒啥可做的。但是當WP360那個App出來後,還是有很多使用者安裝了呢,儘管真的對安全沒什麼太大的協助,但是對使用者瞭解自己的手機的使用方式還是有協助的。其中一位使用者的評價是:從android到PC,我一直用360, 所以在WP上我也用。呵呵,粉絲啊!具體有什麼用其實他也不關心鐵粉而已。
扯遠了!回到這篇隨筆的主題吧:我們的應用只能訪問自己的檔案夾以及有限的公用資料夾,而無法進入別的應用的檔案夾,這就是所謂的Sandbox。那麼我們如果希望調用它們呢?那也還是有方法的。
今天我們就來介紹下app間調用的2種主要方法:
Protocol調用
簡單的說就是用Windows.System.launcher類,通過一個形如"mailto:[email protected]" 這樣由protocol首碼mailto,冒號,以及一個字串組成的uri,調用註冊了protocol 首碼(這裡是mailto)的應用,將整個uri傳給它處理的過程。
比如這段代碼:
await Launcher.LaunchUriAsync(new Uri("mailto:[email protected]"));
運行以後就會調起我們的郵件應用給[email protected]這個郵件帳號發郵件:
是不是很簡單?
當然,這隻是調用了系統的應用。我們也可以調用註冊了相應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
部落格園用戶端UAP開發隨筆 -- 搭建App之間的橋樑