本文档介绍组件管理器如何与各个组件实例交互以管理其生命周期。
生命周期状态
组件实例会经历以下主要生命周期状态:
组件实例在未运行时可能会在存储介质上保留隔离的持久状态,这有助于它们在重启后保持连续性。
已创建
组件实例可以通过以下方式创建:
每个组件实例都有一个组件网址,用于描述如何解析组件,以及一个 moniker,用于通过从根目录开始的路径来唯一标识实例。如需了解详情,请参阅组件标识符。
已解析
解析组件实例会提取指定组件网址的组件声明。组件管理器通过在
环境中查找支持匹配网址协议的
组件解析器来解析组件网址。开发者可以使用
ffx component resolve命令手动解析组件。
组件必须成功解析后才能启动。
已启动
启动组件实例会加载并运行组件的程序,并为其提供访问所需功能的能力。
启动组件实例的最常见原因是另一个
组件 绑定到其公开的功能之一。开发者还可以使用 ffx component start 命令手动启动组件。
启动后,组件实例将继续运行,直到 停止。
已停止
停止组件实例会终止组件的程序,但会保留 其 持久状态。当组件的 程序退出时,组件会进入此状态,如组件的运行程序所定义。
组件框架可能会因以下原因停止组件实例:
- 组件即将被销毁。
- 系统正在关闭。
组件可以实现生命周期处理程序(示例),以 接收有关即将终止等事件的通知。 请注意,在资源耗尽、崩溃或电源故障等情况下,组件可能无法接收这些事件。
关闭
组件管理器会将组件实例的最终执行状态设置为 关闭,以表明该实例无法重启,并发出该实例 可以安全地销毁的信号。
已销毁
组件实例可以通过以下方式销毁:
- 在运行时从集合中动态移除。如果组件是要移除的另一个组件的后代,也是如此。
销毁后,组件管理器会从组件拓扑中完全移除该实例,包括所有持久状态。同一组件的新实例将各自拥有自己的身份和状态,与之前的所有实例都不同。
生命周期操作
本部分介绍了组件框架用于转换组件实例生命周期状态的常见操作。
绑定
当组件实例 A 连接到 B 提供的某些功能时,A 会 绑定 到另一个组件实例 B。如果组件 B
尚未运行,则会导致其 启动。
具体而言,A 可以通过以下两种方式绑定到 B:
A连接到其命名空间中的功能,该功能由 公开或提供给B。 这是最常见的方式。A绑定到fuchsia.component.Binder框架协议,该协议由B公开或提供。与传统功能不同,此协议由组件框架实现。
关闭顺序
当组件框架决定关闭组件时,它将按照组件及其子项的依赖关系确定的顺序关闭组件及其子项。此行为是递归的,这意味着关闭组件将关闭该组件下的完整拓扑。
realm 中的组件会按照特定顺序关闭,该顺序基于这些组件之间的强依赖关系。组件之间的依赖关系形成有向无环图 (DAG),组件按照目标到来源的顺序关闭。
依赖关系图中会考虑所有功能。默认情况下,功能作为强依赖项提供,但客户端可以通过指定 dependency: weak 来提供依赖项。
例如,假设一个 realm 包含组件 A、B、C、D。
提供以下功能:
A向B和C强提供功能。B向C强提供功能。C向B弱提供功能。
以下是相关 realm 的图示:
关闭顺序如下:
D和C可以按任意顺序关闭,因为它们没有依赖项。- 然后,
B可以在C之后关闭。 - 然后,
A可以在B之后关闭。
弱依赖项
请注意,组件依赖关系形成 DAG,这意味着没有循环。这意味着,在上面的示例中,C 无法向 A 强提供功能。
不过,C 可以使用 dependency: "weak" 向 A 提供功能。
弱依赖项不被视为依赖项 DAG 的一部分,也不会影响关闭顺序。