****DisplayRotation
系统旋转要用到的相关状态,并监听旋转相关的状态的设置变化
mRotatingSeamlessly: 在开始seamless旋转到最后一个要选择的窗口draw完后为true
mSeamlessRotationCount: 需要进行seamless选择的窗口数。当该数量不为0时,新的旋转命令会被阻塞。
mUserRotation:用户上次设定的屏幕角度。默认值为0
mUserRotationMode:用户上次设定的旋转角度模式
// 输入要显示的方向,将根据系统的各种策略,输出surface要对应什么旋转角度
int rotationForOrientation()
// 判断旋转的方式,1、seamless 2、normal
boolean shouldRotateSeamlessly()
// 触发旋转
// 内部流程:1、检验是否满足进行旋转的条件 2、recents相关操作
// 3、mService.mAtmService.getTransitionController().collect(mDisplayContent);
// 4、标记displaycontent,需要进行relayout
// 5、向WMS注册冻屏回调
// 6、确定旋转的方式,并初始化该方式,如果是normal方式,则会走到冻屏流程
// 7、startRemoteRotation
boolean updateRotationUnchecked()
// 实作了settings变化监听注册,与监听回调回调中,将系统的变化同步到当前成员变量,同时通知WMS进行旋转。
$SettingsObserver
// 监听屏幕方向传感器的数据变化,当变化时,通知WMS进行旋转
$OrientationListener
// 将settings的旋转设置状态同步到当前对象
private boolean updateSettings()
// 判断当前状态是否要启用传感器带动旋转
private boolean needSensorRunning()
// 旋转动画的选择判定
private RotationAnimationPair selectRotationAnimation()
WMS
// 屏幕旋转的最终执行还是要WMS来执行,因为WMS能控制其他窗口
// 遍历每个窗口,如果发生旋转,则通过AMS notify Activity进行变化
void updateRotation()
// 1、可行性检验 2、设置power模式,加速 3、冻结input
// 4、冻结appTransition 5、displayContent的旋转动画
void startFreezingDisplay DisplayContent
当前屏幕显示内容的状态
// 标注当前屏幕是否需要relayout
mLayoutNeeded