Android系统自动转屏流程(一)

来源:互联网 发布:淘宝十大人气主播 编辑:程序博客网 时间:2024/06/01 08:41

Android是支持屏幕进行旋转的,通过旋转使得屏幕呈现出竖屏或者横屏的布局。有时我们在使用的时候会发现,旋转时会有动画。这是因为,为了使用户在使用转屏旋转过程中提升体验,系统会对屏幕截屏,使用截屏获取的图片进行旋转动画,指导完成旋转,我们所看到的旋转动画其实是,旋转开始时系统所截屏幕所做的动画。

手机是否支持转屏可以在Setting设定,对于Setting中有关是否自动转屏,PhoneWindowManager中的init()函数中创建了SettingsObserver对象,其observe()方法将监听Settings.System.USER_ROTATION的值。如果设置中打开auto-rotation,会触发如下流程。

 

上图可能较小无法看清,大图请查看文档最后的附图。

下面对该流程中涉及到的代码进行分析:

1AccessibilitySettings类是各手机厂商自己的setting模块中的一个类,该类的命名和方法可能不同,详细代码见下。

 

 

 

2handleLockScreenRotationPreferenceClick()也是AccessibilitySettings.java的方法。在该方法中调用RotationPolicy类的setRotationLockedForAccessbility(),其实就是用户在settings界面点击auto-Rotation传入对应的值。

 

3、下面的各类及方法为android中源码。enable为是否允许自动旋转的使能位。

 

4、在setRotationLock()方法中,根据enable的值,分别执行wms的不允许转屏和允许转屏。

 

5freezeRotation()不允许转屏,thawRotation()允许转屏。这里我们分析转屏的流程,因此顺着thawRotation()的流程分析。

 

 

6PhoneWindowManager.javasetUserRotationMode。该方法会在Settings.System中写入值。

 

7PhoneWindowManager中的init()函数中创建了SettingsObserver对象,其observe()方法将监听Settings.System.USER_ROTATION的值,监听到该值后调用onChange

 

 

8该方法是wms在调用freezeRotation()thawRotation()后调用的。

 

9、这里会触发SettingsObserver.onChange(),其中主要调用了updateSettings()updateRotation()两个函数。其主要的工作是根据需要监听传感器数据,据此判断是否要转屏,如果传感器传回的值改变,则对configuration的各种更新。函数updateSettings()如它的名字主要更新设置信息。如果UserRotation(朝向信息,如Surface.ROTATION_0)和UserRotationModeUSER_ROTATION_FREE vs. USER_ROTATION_LOCKED)有更新,就设置标记updateRotationtrue表示接下去需要更新rotation相关信息。

 

 

 

 

 

 

 

 


原创粉丝点击