[源碼下載]
html
做者:webabcd
介紹
背水一戰 Windows 10 之 應用間通訊html5
示例
一、演示如何經過協議打開指定的 app 並傳遞數據以及獲取返回數據
App.xaml.csc++
protected override void OnActivated(IActivatedEventArgs args) { // 經過可返回結果的協議激活應用程序時(參見 App2AppCommunication/LaunchUriForResults.xaml.cs 中的示例) if (args.Kind == ActivationKind.ProtocolForResults) { ProtocolForResultsActivatedEventArgs protocolForResultsArgs = args as ProtocolForResultsActivatedEventArgs; Frame rootFrame = new Frame(); rootFrame.Navigate(typeof(Windows10.App2AppCommunication.LaunchUriForResults), protocolForResultsArgs); Window.Current.Content = rootFrame; Window.Current.Activate(); } }
App2AppCommunication/LaunchUriForResults.xamlweb
<Page x:Class="Windows10.App2AppCommunication.LaunchUriForResults" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows10.App2AppCommunication" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Name="grid" Background="Transparent"> <StackPanel Margin="10 0 10 10"> <TextBlock Name="lblMsg" Margin="5"> <Run>本程序能夠處理可返回結果的 webabcd: 協議</Run> </TextBlock> <Button Name="btnOpenProtocol" Content="打開自定義協議 webabcd: 並傳遞數據給目標程序,而後獲取目標程序的返回數據" Click="btnOpenProtocol_Click" Margin="5" /> <Button Name="btnBack" Content="返回數據" Click="btnBack_Click" Margin="5" /> </StackPanel> </Grid> </Page>
App2AppCommunication/LaunchUriForResults.xaml.csexpress
/* * 演示如何經過協議打開指定的 app 並傳遞數據以及獲取返回數據 * * 一、在 Package.appxmanifest 中新增一個「協議」聲明,並作相關配置 * 本例中的這部分的配置以下,協議名必須全小寫 * <uap:Extension Category="windows.protocol"> * <uap:Protocol Name="webabcd" ReturnResults="optional"> * <uap:Logo>Assets\StoreLogo.png</uap:Logo> * </uap:Protocol> * </uap:Extension> * 其中關於 ReturnResults 的說明以下: * optional - 能夠經過 LaunchUriAsync() 啓動,也能夠經過 LaunchUriForResultsAsync() 啓動 * always - 只能經過 LaunchUriForResultsAsync() 啓動 * none - 只能經過 LaunchUriAsync() 啓動 * 二、在 App.xaml.cs 中 override void OnActivated(IActivatedEventArgs args),以獲取相關的協議信息 * * * ProtocolForResultsActivatedEventArgs - 經過可返回結果的協議激活應用程序時的事件參數 * Uri - 協議的 uri * CallerPackageFamilyName - 激活當前 app 的 app 的 PackageFamilyName * ProtocolForResultsOperation - 獲取 ProtocolForResultsOperation 對象 * Data - 返回一個 ValueSet 對象,用於獲取激活此 app 的 app 傳遞過來的數據 * Kind - 此 app 被激活的類型(ActivationKind 枚舉) * 本例爲 ActivationKind.ProtocolForResults * PreviousExecutionState - 此 app 被激活前的狀態(ApplicationExecutionState 枚舉) * 好比,若是此 app 被激活前就是運行狀態的或,則此值爲 Running * SplashScreen - 獲取此 app 的 SplashScreen 對象 * User - 獲取激活了此 app 的 User 對象 * * ProtocolForResultsOperation - 用於返回數據給激活當前 app 的 app * ReportCompleted(ValueSet data) - 返回指定的數據 * * Launcher - 用於啓動與指定 Uri 相關的應用程序 * LaunchUriAsync(Uri uri) - 打開指定的 Uri,無返回結果 * LaunchUriForResultsAsync(Uri uri, LauncherOptions options, ValueSet inputData) - 打開指定的 Uri,並能夠獲取到被激活的 app 返回的數據 * 使用此種方式的話,必需要經過 LauncherOptions 的 TargetApplicationPackageFamilyName 指定目標程序的 PackageFamilyName * 使用此種方式的話,除了經過協議 uri 傳遞數據外,還能夠經過 ValueSet 傳遞數據 * 使用此種方式的話,會返回一個 LaunchUriStatus 類型的枚舉數據 * Success - 成功激活了 * AppUnavailable - 沒有經過 TargetApplicationPackageFamilyName 找到指定的 app * ProtocolUnavailable - 指定的目標程序不支持此協議 * Unknown - 激活時發生了未知錯誤 * * LauncherOptions - 啓動外部應用程序時的相關選項 * TargetApplicationPackageFamilyName - 指定目標程序的 PackageFamilyName * * * 注:經過 ValueSet 傳遞數據,最大不能超過 100KB */ using System; using Windows.ApplicationModel.Activation; using Windows.Foundation.Collections; using Windows.System; using Windows.UI; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; namespace Windows10.App2AppCommunication { public sealed partial class LaunchUriForResults : Page { private ProtocolForResultsActivatedEventArgs _protocolForResultsArgs; private ProtocolForResultsOperation _protocolForResultsOperation; public LaunchUriForResults() { this.InitializeComponent(); } protected override void OnNavigatedTo(NavigationEventArgs e) { // 獲取 ProtocolForResultsActivatedEventArgs 對象(從 App.xaml.cs 傳來的) _protocolForResultsArgs = e.Parameter as ProtocolForResultsActivatedEventArgs; // 顯示協議的詳細信息 if (_protocolForResultsArgs != null) { _protocolForResultsOperation = _protocolForResultsArgs.ProtocolForResultsOperation; grid.Background = new SolidColorBrush(Colors.Blue); lblMsg.Foreground = new SolidColorBrush(Colors.White); lblMsg.Text = "激活程序的自定義協議爲: " + _protocolForResultsArgs.Uri.AbsoluteUri; lblMsg.Text += Environment.NewLine; if (_protocolForResultsArgs.Data.ContainsKey("InputData")) { string inputData = _protocolForResultsArgs.Data["InputData"] as string; lblMsg.Text += $"收到了數據:{inputData}"; lblMsg.Text += Environment.NewLine; } btnOpenProtocol.Visibility = Visibility.Collapsed; } else { btnBack.Visibility = Visibility.Collapsed; } } // 打開自定義協議 webabcd: 並傳遞數據給目標程序,而後獲取目標程序的返回數據 private async void btnOpenProtocol_Click(object sender, RoutedEventArgs e) { Uri uri = new Uri("webabcd:data"); var options = new LauncherOptions(); // 用 LaunchUriForResultsAsync() 的話必需要指定目標程序的 PackageFamilyName options.TargetApplicationPackageFamilyName = "48c7dd54-1ef2-4db7-a75e-7e02c5eefd40_vsy44gny1fmrj"; ValueSet inputData = new ValueSet(); inputData["InputData"] = "input data"; lblMsg.Text = "打開 webabcd: 協議,並傳遞數據"; lblMsg.Text += Environment.NewLine; LaunchUriResult result = await Launcher.LaunchUriForResultsAsync(uri, options, inputData); if (result.Status == LaunchUriStatus.Success && result.Result != null && result.Result.ContainsKey("ReturnData")) { ValueSet theValues = result.Result; string returnData = theValues["ReturnData"] as string; lblMsg.Text += $"收到返回數據:{returnData}"; lblMsg.Text += Environment.NewLine; } } // 返回數據 private void btnBack_Click(object sender, RoutedEventArgs e) { ValueSet result = new ValueSet(); result["ReturnData"] = "return data"; _protocolForResultsOperation.ReportCompleted(result); } } }
二、演示如何將本 app 沙盒內的文件共享給其餘 app 使用
App2AppCommunication/SharedStorage.xamlwindows
<Page x:Class="Windows10.App2AppCommunication.SharedStorage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows10.App2AppCommunication" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Transparent"> <StackPanel Margin="10 0 10 10"> <TextBlock Name="lblMsg" TextWrapping="Wrap" Margin="5" /> <Button Name="btnSave" Content="將沙盒內的指定文件設置爲可共享,並生成 token" Click="btnSave_Click" Margin="5" /> <Button Name="btnLoad" Content="根據 token 獲取文件(爲了演示方便,本例就在同一個 app 中演示了,實際上在其餘 app 中也是能夠根據此 token 獲取文件的)" Click="btnLoad_Click" Margin="5" /> <Button Name="btnDelete" Content="根據 token 將沙盒內的可共享文件設置爲不可共享" Click="btnDelete_Click" Margin="5" /> </StackPanel> </Grid> </Page>
App2AppCommunication/SharedStorage.xaml.csapp
/* * 演示如何將本 app 沙盒內的文件共享給其餘 app 使用 * * SharedStorageAccessManager.AddFile(IStorageFile file) - 指定文件設置爲可共享,並返回 token * SharedStorageAccessManager.RedeemTokenForFileAsync(string token) - 在其餘 app 中能夠根據 token 獲取 StorageFile 對象,而且可讀可寫 * SharedStorageAccessManager.RemoveFile(string token) - 根據 token 將指定的可共享文件設置爲不可共享 * * 注: * 一、一個 token 的有效期爲 14 天 * 二、一個 app 最多能夠擁有 1000 個有效的 token * 三、一個 token 被訪問一次後就會失效(文檔是這麼寫的,可是實際測試發現並不會失效) */ using System; using Windows.ApplicationModel.DataTransfer; using Windows.Storage; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace Windows10.App2AppCommunication { public sealed partial class SharedStorage : Page { private string _sharedToken; public SharedStorage() { this.InitializeComponent(); } // 將沙盒內的指定文件設置爲可共享,並生成 token private async void btnSave_Click(object sender, RoutedEventArgs e) { StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(@"webabcdTest\sharedStorage.txt", CreationCollisionOption.ReplaceExisting); await FileIO.WriteTextAsync(file, "I am webabcd: " + DateTime.Now.ToString()); _sharedToken = SharedStorageAccessManager.AddFile(file); lblMsg.Text += $"文件 {file.Path} 已經被設置爲可共享,其 token 值爲 {_sharedToken}"; lblMsg.Text += Environment.NewLine; } // 根據 token 獲取文件 // 爲了演示方便,本例就在同一個 app 中演示了,實際上在其餘 app 中也是能夠根據此 token 獲取文件的 private async void btnLoad_Click(object sender, RoutedEventArgs e) { try { StorageFile file = await SharedStorageAccessManager.RedeemTokenForFileAsync(_sharedToken); string textContent = await FileIO.ReadTextAsync(file); lblMsg.Text += $"token 值爲 {_sharedToken} 的文件的內容爲: {textContent}"; lblMsg.Text += Environment.NewLine; } catch (Exception ex) { lblMsg.Text += ex.ToString(); lblMsg.Text += Environment.NewLine; } } // 根據 token 將沙盒內的可共享文件設置爲不可共享 private void btnDelete_Click(object sender, RoutedEventArgs e) { try { SharedStorageAccessManager.RemoveFile(_sharedToken); lblMsg.Text += $"token 值爲 {_sharedToken} 的文件取消共享了"; lblMsg.Text += Environment.NewLine; } catch (Exception ex) { lblMsg.Text += ex.ToString(); lblMsg.Text += Environment.NewLine; } } } }
OK
[源碼下載]asp.net