如何处理应用激活 (HTML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

了解如何为你的 Windows 运行时应用定义激活体验。

每次应用启动时,都会 引发 activated 事件。如果系统需要将相关的应用参数传递到新 激活合约,当应用运行时,也会 引发此事件。你可以使用 activated 事件来还原应用的先前状态并检索与应用激活所对应的合约相关的激活参数。对于激活合约的完整列表及其参数的更详细信息,请参阅 ActivationKind 枚举。

下列步骤将介绍如何注册 activated 事件、如何使用该事件还原一些基本的应用状态,以及如何使用该事件处理磁贴中的默认激活。

说明

步骤 1: 注册激活的事件

在全局范围内注册 activated 事件。此示例将 activatedHandler 设置为激活处理程序。使用激活处理程序,可以检索应用之前的 ApplicationExecution 状态和激活参数。有关激活类型的列表,请参阅 ActivationKind 枚举。


var app = WinJS.Application;

app.addEventListener("activated", activatedHandler, false);
app.start();

步骤 2: 在应用挂起而后终止的情况下还原应用程序数据

操作系统在挂起应用后可能出于一些原因而将其终止。发生这种情况的示例如下:用户手动关闭应用、用户注销或者系统的资源不足。如果用户在操作系统已终止应用后启动该应用,则会收到 activated 事件。 使用 sessionState 对象确定你是否需要还原应用的数据或使用其默认值启动。如果定义了 sessionState 变量,则使用这些变量还原应用的数据并刷新其显示的内容。如果未定义,则加载默认值。

你也可以对事件参数使用 PreviousExecutionState 属性来确定你的应用是否应还原状态。如果该属性的 ApplicationExecutionState 值为 Terminated,则应该还原状态。如果是其他任何值,则应该加载应用的默认值。

注意   如果在应用已经运行时对其进行激活,则应注意不要还原已保存的数据。

 

function activatedHandler(eventArgs) {
   if (eventArgs.detail.kind == Windows.ApplicationModel.Activation.ActivationKind.launch) 
   {
      // Check whether my session state variables are valid.
      // If so, retrieve the application data saved in the checkpoint handler
      if (app.sessionState) 
      {
         // TODO: Populate the UI with the previously saved application data            
      } 
      else
      {
         // TODO: Populate the UI with defaults             
      }

   }
}

步骤 3: 如果在新计算机上激活,则查询现有的辅助磁贴

// Get secondary tile ids for the application and list them out

Windows.UI.StartScreen.SecondaryTile.findAllAsync().then(function (tiles) {
   if (tiles) {
      tiles.forEach(function (tile) {
         // Inspect the tile and do required work 
      });
   } 
   else {
      // there are no tiles 
      }
   });
}

步骤 4: 检索激活参数

当系统激活应用时,可能存在其他用于激活的上下文。

每种类型的激活合约都具有各自唯一的一组参数,向你提供有关应用激活原因的更多信息。每个合约的 eventArgs 类都在 Windows.UI.WebUI 命名空间中定义。以下代码片段展示了如何从默认磁贴启动中检索参数。

function activatedHandler(eventArgs) {
    if (eventArgs.detail.kind == Windows.ApplicationModel.Activation.ActivationKind.launch) 
    {
        if (eventArgs.detail.arguments !== '')
        {
            // TODO: Parse the arguments string
        }
    // Initialize the WinJS controls
    eventArgs.setPromise(WinJS.UI.processAll();)

    }
}

步骤 5: 设置应用 UI

如果要处理初始启动的激活,则系统将显示初始屏幕直至应用完全激活。在某些情况下,应用必须异步工作(例如,从文件中读取设置)以便正确初始化其 UI。这项工作需要在激活期间完成,以便初始屏幕在 UI 完成前不会关闭。你可以使用激活 eventArgs 上的 setPromise() 方法推迟激活的完成。在之前的代码片段中,setPromise() 用于推迟激活的完成,直至对 processAll() 的异步调用完成为止。

如果使用 Microsoft Visual Studio 模板,则会为你调用 setPromise()。如果在初始屏幕关闭前存在需要完成的异步工作,则在新的页面片段的“已处理”事件期间完成此工作。确保从此异步活动中返回 promise 以延迟“已处理”事件的完成直至活动完成。在应用导航到特定页面片段时调用已处理事件,以便确保特定于激活的所有代码仅在激活触发的导航上运行。在正常导航中,应跳过该代码。

注意  初始屏幕仅用于显示在设置初始 UI 时涉及的简短活动。较长时间运行的活动(例如,对网络的调用或从磁盘加载较大文件)不应在激活期间完成。在这些情况下,应用应在激活或扩展的初始屏幕期间设置进度 UI,然后立即从激活返回,同时异步操作继续在后台完成。

 

processed: function (element, options) {
            // During an initial activation this event is called before activation completes.
            // Do any initialization work that is required for the initial UI to be complete.
            // Retrieve settings from a file
            return app.local.readText(settingsFile, "default").then(function (str){
                //use the settings to update the UI
            }, function () {
                //handle the error condition
               });
           },

ready:     function (element, options) {
            // During an initial activation this event is called after activation completes.
            // Do any initialization work that is not related to getting the initial UI set up.
           }

备注

当应用启动时,激活的事件将在 DOMContentLoaded 事件之后、WinJS.Application.onloaded 事件之前引发。 当应用正在运行时,随时可能引发激活的事件。

注意  如果由于任何原因你的应用需要导航至顶层文档,你必须先完成激活,然后才能尝试进行顶层导航。如果你在完成激活之前就尝试进行顶层导航,你的应用将崩溃。这确保了在导航过程中摧毁并重建 JavaScript 上下文之前,你的应用和系统处于一致的状态。

 

注意  

在 Windows Phone 应用商店应用中,resuming 事件始终后跟 activated 事件,即使你的应用当前已挂起且用户从主要磁贴或应用列表中重新启动也是如此。如果当前窗口上已有内容集,则应用可跳过初始化。你可以检查 LaunchActivatedEventArgs.TileId 属性以确定该应用是从主要磁贴启动还是从辅助磁贴启动,并根据该信息决定应刷新还是恢复应用体验。

完整示例

有关展示如何处理应用生命周期事件的完整代码示例,请参阅使用 WinJS 示例的应用激活和挂起使用 WRL 示例的应用激活、恢复和挂起

相关主题

任务

如何挂起应用

如何恢复应用

概念

应用程序生命周期

参考

Windows.ApplicationModel.Activation.ActivationKind

Windows.UI.WebUI.WebUILaunchActivatedEventArgs

WinJS.Application.activated