活动

Activity 是应用程序 UI 的一部分,负责执行某项任务。例如:媒体播放器应用程序可以有不同的活动,如收音机、音乐播放器和 AUX。

然而,Activity 也可以是一个较小的任务,例如,当用户在媒体播放器中更改音量时出现的弹出音量指示器的 Activity。Activity 可以是可视的,但不一定必须是可视的。例如,一个可视的 Activity 可以实例化一个预设以显示弹出窗口,而一个非可视的 Activity 可以是音乐播放,它在后台播放音乐,而不管其他 Activity。

Activity Host 定义了其活动何时处于活动状态的规则。Kanzi 具有以下活动主机:

  • Exclusive Activity Host 和 Data-Driven Exclusive Activity Host 一次只能激活一个子活动。当数据驱动独占活动主机或独占活动主机的一个子活动处于活动状态时,该活动主机的所有其他活动都处于非活动状态。

    例如,您可以使用 Data-Driven Exclusive Activity Host 或 Exclusive Activity Host 在应用程序中切换视图。请参阅 独占活动主机 和 数据驱动独占活动主机。

    独占活动主机

    ../../_images/exclusive-activity-host.gif

    数据驱动独占活动主机

    ../../_images/data-driven-exclusive-activity-host.gif
  • Parallel Activity Host 可以同时激活多个子活动。当您激活一个活动时,Parallel Activity Host 会将该活动置于前台。在 Parallel Activity Host 中,您可以对活动进行分组,以按照您在活动树中定义的顺序显示这些组。当您激活组中的一个活动时,Parallel Activity Host 会将该组中的活动置于前台。

    例如,这样您可以在常规通知(如电话通知)前面显示关键消息(如引擎故障)。在这两组中,Parallel Activity Host 按激活顺序显示活动。请参阅 并行活动主机。

    ../../_images/parallel-activity-host.gif

您可以实时将活动添加到活动主机中。这使您能够使用 Kanzi Engine API 来生成活动,或向应用程序添加另一个应用程序,而该应用程序的活动结构在运行应用程序之前是未知的。例如,您可以使用 Kanzi Engine API 来生成大量要向用户显示的菜单页面。

应用程序 UI 结构和导航

Activity、Data-Driven Exclusive Activity Host、Exclusive Activity Host 和 Parallel Activity Host 一起使您能够创建用户可以在您的应用程序中导航的 UI。您通过激活和停用 Activities 来实现对用户交互或传入应用程序的数据变化的响应,从而切换应用程序视图并显示不同的应用程序层,例如弹出窗口。这样,您可以控制用户可以看到和交互的应用程序 UI 的哪些部分。

使用 Activities、Data-Driven Exclusive Activity Hosts、Exclusive Activity Hosts 和 Parallel Activity Hosts 来形成导航图。Activities 定义内容元素,而 Activity Hosts 定义应用程序 UI 中的导航模式。在每个 Activity Host 中,使用 Activities 在 Activity Host 所代表的应用程序中创建 UI 内容。例如:使用 Activity Host 和 Activities,您可以组织 UI 以显示应用程序中的不同视图,例如媒体播放器、联系人和电话视图,并在弹出窗口中显示内容。

使用 Activity Hosts 激活和停用 Activities:

  • 当一个 Activity 处于活动状态时,Activity 预设被附加到节点树上,是可见的,并且用户可以与其内容进行交互。

  • 当一个 Activity 处于非活动状态时,Activity 预设未附加到节点树上,不可见,用户无法与其内容进行交互。

Activity 和 Activity Host 节点继承自 ContentLayout2D 和 ContentLayout3D 类,以像 Content Layout 节点一样布置其内容。请参阅 使用 Content Layout 节点。

活动的状态管理

每个 Activity 都有 Activity Status 属性,该属性指示该 Activity 的状态。当一个 Activity 变为活跃或不活跃时,Activity Status 属性会发生变化,您可以在应用程序中对这些变化做出反应。当您激活一个 Activity 时,其 Activity Host 会实例化该 Activity 的预设。当您停用一个 Activity 时,其 Activity Host 会从节点树中移除该 Activity 的预设。

Activity Status 属性定义了这些状态:

活动状态

描述 (Description)

活动

该 Activity 处于活动状态并显示其内容。

停用

Activity 正在过渡到 Inactive 状态。

此状态用于在 Data-Driven Exclusive Activity Host 和 Exclusive Activity Host 中同步过渡动画。

未激活

该 Activity 处于非活动状态,并且不显示其内容。

激活

Activity 正在过渡到 Active 状态。

此状态用于在 Data-Driven Exclusive Activity Host 和 Exclusive Activity Host 中同步过渡动画。

在 Data-Driven Exclusive Activity Host 和 Exclusive Activity Host 节点中:

  • 一次只能有一个子 Activity 处于活动状态。

  • 当一个 Activity 处于 Deactivating 状态时,另一个 Activity 可以同时处于 Activating 状态。

在 Parallel Activity Host 节点中,多个 Activity 可以同时处于 Active 状态,因此任何 Activity 都可以处于任何状态。

要设置活动主机变为活动状态时哪个活动处于活动状态:

  • 在 Exclusive Activity Host 或 Parallel Activity Host 中,设置 Activity 的 InitiallyActive 属性。请参阅 设置初始活动的 Activity 和 设置初始活动的 Activity。

  • 在 Data-Driven Exclusive Activity Host 中,使用 Active Activity Index 属性。Active Activity Index 属性的值指向列表数据对象中的项目,Data-Driven Exclusive Activity Host 使用该项目来创建一个 Activity。

活动过渡

这些转换定义了一个 Activity 转换:

  • Active -> Deactivating

  • Deactivating -> Inactive

  • Inactive -> Activating

  • Activating -> Active

在状态更改期间,Activities 使用这些过渡,包括具有中间 Activating 和 Deactivating 状态的过渡。跳过这些中间状态的过渡,例如 Active -> Inactive (没有 Deactivating 状态)或 Inactive -> Active (没有 Activating 状态),即使您创建它们,也不会发生。

../../_images/transitions-between-statuses.svg

在活动树中,当您停用包含子活动的活动时,Activity Host 会立即停用子活动,而不应用 Active -> Deactivating 和 Deactivating -> Inactive 过渡。而当您激活包含子活动的活动时,Activity Host 会通过应用 Inactive -> Activating 和 Activating -> Active 过渡来激活子活动。

要了解如何在活动之间创建过渡,请参阅 在 Activities 之间创建转换。

在 Data-Driven Exclusive Activity Host 和 Exclusive Activity Host 节点中,活动之间的过渡如下所示:

  1. 活动 1:状态为 Active。

    活动 2:该活动未加载。

  2. 活动 1:State Manager 播放 Active -> Deactivating 过渡动画(如果有)。Activity Host 发送 ActivityConcept::ActivityDeactivatingMessage 和 ActivityConcept::StatusChangedMessage 消息。

    活动 2:Activity Host 加载活动的资源。

  3. 活动 1:状态为 Deactivating。

    活动 2:状态为 Inactive。

  4. 活动 1:State Manager 播放 Deactivating -> Inactive 过渡动画(如果有)。Activity Host 发送 ActivityConcept::ActivityDeactivatedMessage 和 ActivityConcept::StatusChangedMessage 消息。

    活动 2:State Manager 播放 Inactive -> Activating 过渡动画(如果有)。Activity Host 发送 ActivityConcept::ActivityActivatingMessage 和 ActivityConcept::StatusChangedMessage 消息。

  5. 活动 1:状态为 Inactive。

    活动 2:状态为激活中。

  6. 活动 1:Activity Host 卸载活动的资源。

    活动 2:State Manager 播放 Activating -> Active 过渡动画(如果有)。Activity Host 发送 ActivityConcept::ActivityActivatingMessage 和 ActivityConcept::StatusChangedMessage 消息。

  7. 活动 1:该活动已卸载。

    活动 2:状态为 Active。

../../_images/eah-ddeah-activity-transitions.svg../../_images/activity-transition-steps.gif

活动的数据和逻辑编程

对于每个 Activity,您可以定义特定于该 Activity 的属性。这些属性称为 Activity 属性。例如,一个用于音乐播放器的 Activity 可以打开和关闭音乐,或更改音量级别。

当您手动为一个 Activity 节点创建属性时,将该属性的命名空间设置为 ActivityProperty。您可以创建具有 int、bool、float 和 enum 数据类型的属性。如果您为一个 Activity 使用 Code Behind,Kanzi 会将该 Activity 的属性添加到 Code Behind。

Activity 属性的值实现了您的 Kanzi 应用程序的状态机和逻辑,这就是为什么 Kanzi 即使在 Activity 被停用时也会保留这些属性的值。当 Kanzi 停用一个 Activity 时,它会序列化该 Activity 的 Activity 属性,而当 Kanzi 激活该 Activity 时,它会反序列化该 Activity 的状态并恢复其 Activity 属性值。

有关活动编程逻辑的更多信息,请参阅 使用代码隐藏的编程活动。

虚拟化

活动虚拟化的主要目标是高效管理应用程序的内存消耗。由于整个应用程序的导航图可能很大,因此始终将 UI 和资产加载在内存中通常不可行。

当您激活一个活动时,其活动主机会动态加载预设件并异步加载所需的资源。停用时,活动主机会将该活动从节点树中分离,并删除该活动实例。

默认情况下,已获取的资源会保留在内存中。要更改此行为,您可以在 Activity Browser 中启用 OptimizeMemory 属性。启用后,Kanzi 会自动卸载这些活动的预加载资源。

您也可以调用 ResourceManager::purge 来释放已停用活动的资源。

控制虚拟化

默认情况下,当您停用一个 Activity 时,Kanzi 会序列化该 Activity 及其子 Activity 的 Activity 属性值。除了您添加的 Activity 属性值外,这还包括有关 Activity 的焦点和激活状态的信息。请记住,Kanzi 不会序列化其他非 Activity 属性的运行时状态。

当您激活已停用的 Activity 时,Kanzi 会恢复该 Activity 及其子 Activity 的 Activity 属性值。 当您禁用虚拟化时,Kanzi 不会保留 Activity 属性的值。

您还可以在激活之前或停用之后重置活动的序列化状态。默认情况下,Kanzi 会恢复序列化状态。

请参阅 在 Exclusive Activity Host 中控制虚拟化 和 在 Parallel Activity Host 中控制虚拟化。

活动持久性

默认情况下,当您停用一个活动时,Kanzi 会将该活动从节点树中分离,并删除该活动实例。您可以设置 Kanzi 在停用活动时保留该活动实例。当您再次激活此类活动时,Kanzi 会将活动节点恢复为停用前的相同状态,即使您为该活动禁用了虚拟化也是如此。这样,再次激活该活动时可以跳过活动实例化。

请参阅 在 Exclusive Activity Host 中控制 Activity 持久性、在 Parallel Activity Host 中控制 Activity 持久性 和 在 Data-Driven Exclusive Activity Host 中控制活动持久性。

另请参阅

使用 Activity Browser

在 Activities 之间创建转换

教程:构建应用程序 UI

教程:控制应用程序 UI

教程:从数据源生成 UI

教程:使用 C++ 代码后台编程活动