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