<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                WINDOWS 10 2015 年特別版 此文章由機器翻譯。 # 應用集成 - 在 Windows 10 上鏈接和集成應用 通過?[Arunjeet Singh](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=Arunjeet+Singh)?|Windows 2015 年 大多數應用程序開發人員生成或定期維護多個應用程序。如成熟應用程序,用戶經常要求涉及協同工作的多個應用程序的工作流。例如,您可能有的應用程序管理產品庫存和未簽出的另一個應用程序。理想的做法是為協同工作以完成采購工作流的兩個應用程序。 若要解決這一難題的一種方法是只需將所有功能都合并到一個應用程序。實際上,這是一種方法通常在桌面類應用程序中看到。但是,這是充滿了危險性的道路。很快,您得到的大多數用戶只能使用功能的特定子集的臃腫應用程序。應用程序開發人員現在必須管理 UI 復雜性和整個應用程序的更新。甚至更糟糕,作為 UI 復雜性的增加,用戶 — 尤其是在移動 — 開始傾向于多個主要選項。實際上,這種趨勢已向以便用戶可以安裝和使用他們的需要在路上而無需擔心他們并不需要的多余的位將應用程序分解到各自經驗。 若要解決此問題的第二種方法是通信的利用云作為一種應用程序之間。直到獲得超過某個大小或您的數據量非常適用于運行到用戶通過有限的連接。這將啟動以顯示與抱怨如、",在這里我狀態之間進行更新,但它不會顯示在此其他應用程序那邊!" 此外,我總是發現它有點奇怪該應用程序開發人員必須求助于云坐在同一個設備上的兩個應用程序之間進行通信。必須有一種更好的方法。 在本文中,我將介紹一些 Windows 10 為了使應用程序更容易之間的通信而提供的工具。應用程序之間的通信可以采用以下形式的應用程序啟動另一個應用程序與一些數據,也可能表示應用程序只需交換與每個其他而無需任何操作啟動的數據。Windows 10 提供了可用于這兩種情況的工具。 ## 準備應用程序的深層鏈接 讓我們來舉的產品庫存應用程序可以顯示有關產品的詳細信息的示例。現在,我們還將向可以顯示各種趨勢有關什么在哪個位置銷售和銷售需要去哪里何種混合的銷售應用程序。銷售應用程序具有較允許用戶查看有關各個產品的詳細信息的向下鉆取的用戶體驗。當然,產品的最詳細的視圖是在庫存應用程序中。圖 1?顯示舉例說明了有關哪些我所討論的方案。 ![](https://box.kancloud.cn/2016-01-08_568f40703a932.png)? 圖 1 銷售應用程序清單應用程序的深層鏈接 在此方案中,您需要執行的第一件事就是使清單應用程序可用于啟動。若要執行此操作將添加到清單應用程序的包清單 (package.appxmanifest) 的協議聲明。協議聲明是告訴它是可由其他應用程序啟動世界庫存應用程序的方法。圖 2?顯示此聲明如下所示。請注意我使用的協議名稱 com.contoso.showproduct。這是有效的命名約定為自定義協議,因為 Contoso 擁有域 contoso.com。其他應用程序開發人員錯誤地使用相同的自定義方案所幸的是遠程。 ![](https://box.kancloud.cn/2016-01-08_568f407047464.png)? 圖 2 協議聲明 下面是 XML 生成的協議聲明: ~~~ <uap:Extension Category="windows.protocol"> ? <uap:Protocol Name="com.contoso.showproduct" /> </uap:Extension> ~~~ 接下來,您需要添加一些激活代碼以便啟動使用新的協議時,庫存應用程序能夠做出適當響應。因為這就是其中路由所有激活,代碼應歸屬到庫存應用程序的應用程序類 (App.xaml.cs) 中。您重寫要響應協議激活的應用程序類的 OnActivated 方法。圖 3?顯示該代碼如下所示。 圖 3 處理深層鏈接 ~~~ protected override void OnActivated(IActivatedEventArgs args) { ? Frame rootFrame = CreateRootFrame(); ? if (args.Kind == ActivationKind.Protocol) ? { ??? var protocolArgs = args as ProtocolActivatedEventArgs; ??? rootFrame.Navigate(typeof(ProtocolActivationPage), protocolArgs.Uri); ? } ? else ? { ??? rootFrame.Navigate(typeof(MainPage)); ? } ? // Ensure the current window is active ? Window.Current.Activate(); } ~~~ 檢查傳入 IActivatedEventArgs 以查看是否協議激活的類型。如果是,您將類型轉換為 ProtocolActivatedEventArgs 傳入的參數和發送拖到 ProductDetails 頁面上傳入的 URI。ProductDetails 頁設置來分析 URI (例如,com.contoso.showproduct:Details 嗎?ProductId = 3748937 并顯示相應的產品詳細信息。此時,庫存應用程序已準備好處理傳入的深層鏈接。 完成此方案中的最后一步是啟用到庫存應用程序的深層鏈接到銷售的應用程序。這是過程的最簡單一部分。銷售應用程序只是到庫存應用程序使用 Launcher.LaunchUriAsync API 對深層鏈接。下面是該代碼可能如下所示: ~~~ Uri uri = new Uri("com.contoso.showproduct:?ProductId=3748937"); await Launcher.LaunchUriAsync(uri); ~~~ ## 應用程序之間共享數據 有應用程序需要共享數據但不一定的方案涉及向用戶發送到另一個應用程序。例如,我的示例銷售應用程序可以顯示按區域和甚至深入了解一些特定的商店的銷售。顯示此數據按產品分類時它會很有用的存儲區或區域中可用的該產品的單位數。獲取此數據的最佳來源是庫存應用程序中,但在這種情況下啟動庫存應用程序會中斷 ux。這是完全方案 AppService 擴展的排序 ([bit.ly/1JfcVkx](http://bit.ly/1JfcVkx)) 用于處理。 其原理很簡單: 庫存應用程序提供了銷售應用程序可以調用"服務"。銷售應用程序使用此服務來查詢它具有的數據清單應用程序。銷售應用程序一次建立,與清單應用程序之間的連接可以保持打開狀態,只要銷售應用程序尚未被掛起。 ## 創建清單應用程序服務 讓我們看一下如何清點應用程序創建并發布它要提供的應用程序服務。應用程序服務基本上是專用的后臺任務。因此為了添加應用程序服務將 Windows 運行時組件 (通用 Windows) 項目添加到包含庫存應用程序的 Visual Studio 解決方案。您可以在 Visual Studio 在 Visual C# 的添加新項目窗口中找到 Windows 運行時組件項目 |Windows |通用。項目模板是在其他語言的類似的位置。 在新的 Windows 運行時組件項目,您將添加一個名為 InventoryServiceTask 的新類。因為,如前面所示,您希望此代碼在后臺運行而不顯示 UI,應用程序服務是專用的后臺任務。若要告訴操作系統 InventoryServiceTask 是后臺任務,只需實現 IBackgroundTask 接口。IBackgroundTask 接口的 Run 方法將庫存應用程序服務的入口點。在這里,您將延遲以便知道該任務應保留周圍的只要客戶端 (銷售的應用程序) 需要它的操作系統。您還附加到應用程序特定于服務 RequestReceived 事件的事件處理程序。此事件處理程序將調用任何客戶端發送來處理此服務的請求的時間。圖 4?顯示初始化的庫存應用程序服務的代碼如下所示。 圖 4 初始化 Run 方法中的庫存應用程序服務 ~~~ namespace Contoso.Inventory.Service { ? public sealed class InventoryServiceTask : IBackgroundTask ? { ??? BackgroundTaskDeferral serviceDeferral; ??? AppServiceConnection connection; ??? public void Run(IBackgroundTaskInstance taskInstance) ??? { ????? // Take a service deferral so the service isn't terminated ????? serviceDeferral = taskInstance.GetDeferral(); ????? taskInstance.Canceled += OnTaskCanceled; ????? var details = taskInstance.TriggerDetails as AppServiceTriggerDetails; ????? connection = details.AppServiceConnection; ????? // Listen for incoming app service requests ????? connection.RequestReceived += OnRequestReceived; ??? } ? } } ~~~ 現在讓我們看看 RequestReceived 處理程序的實現。再次重申,只要請求派上用場需要延遲。一旦完成后將釋放此延遲處理傳入的請求。貨幣符號的應用程序服務客戶端和應用程序服務之間是通信的一個稱為 ValueSet 的數據結構。ValueSets 是可以執行如整數、 浮點數、 字符串和字節數組的簡單類型的鍵/值字典。 圖 5?顯示清單應用程序服務如何處理傳入的請求。它將檢查命令的傳入消息,然后將使用正確的結果進行響應。在這種情況下,您顯示該服務響應的產品和最后一個時間單位數與它所具有的數據的 GetProductUnitCountForRegion 命令已更新。該服務可能也是從 Web 服務中獲取此數據或者只從脫機緩存中檢索它。比較有利的一點是客戶端 (銷售的應用程序) 不需要知道或在意從數據的用武之地。 圖 5 庫存應用程序接收請求 ~~~ async void OnRequestReceived(AppServiceConnection sender, ? AppServiceRequestReceivedEventArgs args) { ? // Get a deferral so we can use an awaitable API to respond to the message ? var messageDeferral = args.GetDeferral(); ? try ? { ??? var input = args.Request.Message; ??? string command = input["Command"] as string; ??? switch(command) ??? { ????? case "GetProductUnitCountForRegion": ??????? { ????????? var productId = (int)input["ProductId"]; ????????? var regionId = (int)input["RegionId"]; ????????? var inventoryData = GetInventoryData(productId, regionId); ????????? var result = new ValueSet(); ?? ???????result.Add("UnitCount", inventoryData.UnitCount); ????????? result.Add("LastUpdated", inventoryData.LastUpdated.ToString()); ????????? await args.Request.SendResponseAsync(result); ??????? } ??????? break; ????? // Other commands ????? default: ??????? return; ??? } ? } ? finally ? { ??? // Complete the message deferral so the platform knows we're done responding ??? messageDeferral.Complete(); ? } } // Handle cancellation of this app service background task gracefullyprivate void OnTaskCanceled(IBackgroundTaskInstance sender, ? BackgroundTaskCancellationReason reason) { ? if (serviceDeferral != null) ? { ??? // Complete the service deferral ??? serviceDeferral.Complete(); ??? serviceDeferral = null; ? } } ~~~ 也顯示在?圖 5?是取消處理程序的實現。很重要的應用程序服務放棄受理正常取消請求時的延遲。取消應用程序服務后臺任務的可能情況可能是因為客戶端關閉應用程序服務連接或系統資源不足。無論哪種方式,可確保正常取消,取消并不被視為崩潰由平臺。 任何人都可以調用的庫存應用程序服務之前,必須將其發布并為其提供一個終結點。首先,您在庫存應用程序項目添加到新的 Windows 運行時組件的引用。接下來,您的應用程序服務將聲明添加到清單應用程序項目,如中所示?圖 6。入口點設置為 InventoryServiceTask 類的完全限定名和名稱是將用于標識此應用程序服務終結點的名稱。這是客戶端將用于到達它的相同名稱的應用程序服務。 ![](https://box.kancloud.cn/2016-01-08_568f40705f2bc.png) 圖 6 應用程序服務聲明 下面是生成的應用程序服務聲明的 XML: ~~~ <uap:Extension Category="windows.appService" ? EntryPoint="Contoso.Inventory.Service.InventoryServiceTask"> ? <uap:AppService Name="com.contoso.inventoryservice"/> </uap:Extension> ~~~ 另一條客戶端將需要與庫存應用程序服務進行通信是信息的庫存應用程序的包系列名稱。獲取此值的最簡單方法是使用 Windows.ApplicationModel.Package.Current.Id.FamilyName API 在庫存應用程序。我通常只是輸出該值設置為調試窗口并從該處選取它。 ## 調用應用程序服務 現在,庫存應用程序服務已到位,您可以從銷售應用程序調用它。若要調用客戶端的應用程序服務可以使用 AppServiceConnection API。AppServiceConnection 類的實例需要的應用程序服務終結點的名稱和包系列名稱在服務所在的包。將這兩個值視為應用程序服務的地址。 圖 7?顯示銷售應用程序的代碼用于連接到的應用程序服務。請注意 AppServiceConnection.AppServiceName 屬性設置為終結點名稱在清單應用程序的包清單中聲明。此外,清單應用程序的包系列名稱均被插入到 AppServiceConnection.PackageFamilyName 屬性。一旦準備就緒后,調用 AppServiceConnection.OpenAsync API 以打開的連接。OpenAsync API 返回完成后的狀態,并使用此狀態來確定是否已成功建立連接。 圖 7 調用庫存應用程序服務 ~~~ using (var connection = new AppServiceConnection()) { ? // Set up a new app service connection ? connection.AppServiceName = "com.contoso.inventoryservice"; ? connection.PackageFamilyName = "Contoso.Inventory_876gvmnfevegr"; ? AppServiceConnectionStatus status = await connection.OpenAsync(); ? // The new connection opened successfully ? if (status != AppServiceConnectionStatus.Success) ? { ??? return; ? } ? // Set up the inputs and send a message to the service ? var inputs = new ValueSet(); ? inputs.Add("Command", "GetProductUnitCountForRegion"); ? inputs.Add("ProductId",productId); ? inputs.Add("RegionId", regionId); ? AppServiceResponse response = await connection.SendMessageAsync(inputs); ? // If the service responded with success display the result and walk away ? if (response.Status == AppServiceResponseStatus.Success) ? { ??? var unitCount = response.Message["UnitCount"] as string; ??? var lastUpdated = response.Message["LastUpdated"] as string; ??? // Display values from service ? } } ~~~ 連接后,客戶端發送的應用程序服務的一組值中 ValueSet 使用 AppServiceConnection.SendMessageAsync API。請注意,在設置的值中的命令屬性設置為 GetProductUnitCountForRegion。這是應用程序服務可以理解的命令。SendMessageAsync 返回包含設置的值發回的應用程序服務的響應。解析出 UnitCount 和上次更新值并將其顯示。就是這樣。這是與應用程序服務進行通信所需的全部。將 AppServiceConnection 放在 using 塊。這將調用 Dispose 方法在 AppServiceConnection 上盡快 using 塊結束。調用 Dispose 是說它已完成的應用程序服務的通話和它現在可以終止該客戶端的方法。 ## 等一等,Microsoft 使用這些 Api 嗎? 當然,Microsoft 使用這些 Api。作為 Windows 10 的一部分提供的大多數 Microsoft 應用程序實際上是通用的 Windows 平臺應用程序。這包括如照片、 相機、 郵件、 日歷、 Groove 音樂和應用商店的應用程序。開發人員編寫這些應用程序使用許多此處所述實現集成方案的 Api。例如,是否注意到在 Groove 音樂應用程序的"在存儲區中的 Get 音樂"鏈接嗎? 如果點擊或單擊該鏈接 Groove 音樂應用程序使用 Launcher.LaunchUriAsync API 訪問應用商店應用程序。 另一個典型示例是設置應用程序。當您進入帳戶 |您的帳戶和,請嘗試使用相機拍照新配置文件,它使用稱為 Launcher.LaunchUriForResultsAsync API 來啟動相機應用程序要執行該圖片。LaunchUriForResultsAsync 是一種專用的形式的 LaunchUriAsync aka.ms/launchforresults 更多詳細信息中所述。 大量的應用程序還使用應用程序服務將信息傳遞給 Cortana 實時。例如,當應用程序嘗試安裝 Cortana 應響應的語音命令,它實際調用應用程序由 Cortana 提供服務。 ## 總結 Windows 10 附帶了功能強大的工具以幫助在同一個設備上運行的應用程序之間的通信。這些工具將不受限制或限制對哪些應用程序可以彼此通信,或者它們可以交換的數據類型。這是非常相像設計使然。目的是讓應用程序定義他們自己的約定與每個其他和擴展對方的功能。這還允許應用程序開發人員將其應用程序分解為較小的、 分解易于維護、 更新和使用的體驗。這是非常重要,因為用戶越來越多地跨多個設備 live 他們生活和使用他們認為是一項任務到最適合的設備。所有這些 Api 是還通用的這意味著它們的工作在臺式計算機、 便攜式計算機、 平板電腦、 手機和很快 Xbox、 面中心和 HoloLens 上。 * * * Arun Singh?*是通用的 Windows 平臺構建團隊的高級項目經理。關注他的 Twitter:?[@aruntalkstech](https://twitter.com/@aruntalkstech)或閱讀他的博客?[aruntalkstech.com](http://aruntalkstech.com/)。*
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看