1. 多窗口模式的特殊现象:为何多个Activity能同时活跃?
第一次在车机CarLauncher上看到地图应用和主界面同时处于RESUMED状态时,我也吃了一惊。按照传统Android开发经验,新Activity启动时旧Activity必然进入Paused状态,这个铁律怎么在多窗口模式下失效了?通过分析WINDOWING_MODE_MULTI_WINDOW的源码实现,发现这其实是系统框架的刻意设计。
在常规全屏模式(WINDOWING_MODE_FULLSCREEN)下,当新Activity启动时,系统会通过pauseBackTasks方法暂停后台任务栈中的Activity。但在多窗口模式下,关键判断逻辑发生了变化。核心在于TaskFragment.canBeResumed方法,它会检查两个条件:当前TaskFragment是否可见(Visibility)以及顶部Activity是否可获得焦点。重点在于getVisibility方法的实现细节——当检测到上层窗口不是全屏模式且未完全覆盖下层窗口时,系统会认为下层窗口仍然"可见"。
举个例子,车机屏幕左侧显示导航地图(区域为300x600像素),右侧显示音乐播放器。由于两个窗口都没有完全遮蔽对方,系统会将它们都判定为VISIBLE状态。这时即使音乐播放器获得焦点,导航地图也不会被强制暂停,因为框架认为用户仍可能同时需要观察两个应用的内容。这种设计非常符合车载场景的需求,驾驶员既需要操作音乐界面,又需要持续查看导航信息。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 源码解析:Visibility判断的底层逻辑
要真正理解多窗口的生命周期机制,必须深入getVisibility方法的实现细节。这个方法会遍历DisplayArea中所有的TaskFragment,按照Z-order从顶至底检查每个窗口的可见性。关键判断逻辑集中在三个层面:
首先是窗口模式检测。当遇到上层窗口是WINDOWING_MODE_FULLSCREEN时,除非该窗口是半透明的(translucent),否则直接返回INVISIBLE导致下层Activity被暂停。这就是普通全屏应用的运作原理。
其次是边界匹配检测。对于WINDOWING_MODE_MULTI_WINDOW模式,只有当上层窗口的边界完全包含下层窗口时(matchParentBounds=true
