在高级窗口化中,主场景由多个并发可见且可互动的应用面板组成,而不是特定的主 activity。高级窗口化功能使用空白版主界面 activity 作为多窗口任务的可见性屏障。
虽然设置向导 (SUW) 通常被视为主屏幕任务,但我们建议您将 SUW 配置为面板的一部分,以创建更一致、更可靠的主屏幕体验。
配置住宅可见性屏障
确认主屏幕可见性屏障 activity 是直接启动感知主屏幕 activity,并且其主屏幕 intent 过滤器的优先级高于 SUW activity。
如需了解详情,请参阅 StubCarLauncher 软件包中的参考平台。
我们建议您在 build 中包含此软件包,并为所有用户安装此软件包。
配置 SUW 面板
我们建议将 SUW 放置在专用面板中,以处理独特的情况,并允许在默认根任务之外进行专用放置。您可以配置此面板的边界和分层。
为了避免 SUW 被遮挡,我们建议您将 SUW 放置在相对较高的层中。此面板必须分别显示和隐藏 _System_EnterSuwEvent 和 _System_ExitSuwEvent 的系统事件。请考虑以下示例配置:
<TaskPanel id="suw_panel" defaultVariant="@id/closed" displayId="0" controller="@xml/suw_panel_controller">
<TaskBehavior newTaskLaunchPolicy="REPARENT_TO_SOURCE"/>
<Variant id="@+id/base">
<Layer layer="@integer/suw_panel_layer"/>
<Bounds left="0" top="0" width="100%" height="100%" />
<Background color="@color/suw_panel_background_color" />
</Variant>
<Variant id="@+id/opened" parent="@id/base">
<Visibility isVisible="true"/>
</Variant>
<Variant id="@+id/closed" parent="@id/base">
<Visibility isVisible="false"/>
</Variant>
<Transitions>
<Transition onEvent="_System_TaskOpenEvent" onEventTokens="panelId=suw_panel" toVariant="@id/opened"/>
<Transition onEvent="_System_TaskPanelEmptyEvent" onEventTokens="panelId=suw_panel" toVariant="@id/closed"/>
<Transition onEvent="_System_EnterSuwEvent" toVariant="@id/opened"/>
<Transition onEvent="_System_ExitSuwEvent" toVariant="@id/closed"/>
</Transitions>
</TaskPanel>
...
<Controller id="suw_panel_controller">
<ControllerName>
com.android.systemui.car.wm.scalableui.panel.controller.SetupPanelController
</ControllerName>
<PersistentPackage>com.android.car.mysetuppackage</PersistentPackage>
</Controller>
为了与典型的 SUW 应用保持一致,如果设置正在进行时 SUW 面板变为不可见,控制器会向 SUW activity 发送明确的 Home 信号,以表明 SUW 已隐藏。
此问题已得到解决,具体涉及以下情况:SUW 知道用户正尝试通过使用 home intent 来隐藏 SUW,但无法从系统访问 home 信号。
如果您对 SUW 设计有不同的期望,可以通过将 SetupPanelController 替换为自定义控制器来实现所需的行为。