Android 10.0系统自动转屏流程(源码分析)-未完待续

2024-05-24 04:32

本文主要是介绍Android 10.0系统自动转屏流程(源码分析)-未完待续,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android是支持屏幕进行旋转的,通过旋转使得屏幕呈现出竖屏或者横屏的布局。目前网上文章对10.0以上的源码分析流程很少,现分析如下:

文章目录

  • 设置的辅助功能打开或者关闭自动旋转功能
    • 1.packages/apps/Settings/src/com/android/settings/accessibility/AccessibilitySettings.java
    • 2.frameworks/base/core/java/com/android/internal/view/RotationPolicy.java
    • 3.frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
    • 4.frameworks/base/services/core/java/com/android/server/wm/DisplayRotation.java
    • 5. frameworks/base/services/core/java/com/android/server/wm/DisplayWindowSettings.java
    • 6.frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

设置的辅助功能打开或者关闭自动旋转功能

1.packages/apps/Settings/src/com/android/settings/accessibility/AccessibilitySettings.java

1.1 onPreferenceTreeClick(Preference preference)在这里插入图片描述

1.2 handleLockScreenRotationPreferenceClick()
在这里插入图片描述

2.frameworks/base/core/java/com/android/internal/view/RotationPolicy.java

2.1 setRotationLockForAccessibility(Context context, final boolean enabled)
在这里插入图片描述

自动旋转屏幕,打开为1,关闭为0,默认为0。
可以通过:
adb shell settings get system hide_rotation_lock_toggle_for_accessibility 0
辅助功能的自动旋转屏幕开关,0表示打开。1表示关闭。
2.2 private static void setRotationLock(final boolean enabled, final int rotation) 看准参数,里边有个重载方法。
在这里插入图片描述

调用WindowManagerService的两个方法,根据enable状态调用对应方法,freezeRotation()不允许转屏,thawRotation()允许转屏。分两路走流程。

3.frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

3.1freezeRotation(int rotation) 或 thawRotation()
冻结旋转
在这里插入图片描述

解冻旋转
在这里插入图片描述

3.2 freezeDisplayRotation(int displayId, int rotation) 或 thawDisplayRotation(int displayId)

在这里插入图片描述在这里插入图片描述

3.3 wms在调用freezeRotation()或thawRotation()后调用6.2 的updateRotationUnchecked(boolean alwaysSendConfiguration, boolean forceRelayout) 更新未检查的旋转角度

4.frameworks/base/services/core/java/com/android/server/wm/DisplayRotation.java

4.1 freezeRotation(int rotation) 或 thawRotation()
在这里插入图片描述

4.2 setUserRotation(int userRotationMode, int userRotation) 该方法会在Settings.System中写入值。
在这里插入图片描述

冻结旋转freezeRotation: 会存储accelerometer_rotation 值为1,解冻旋转为0。
adb shell settings get system accelerometer_rotation 0
旋转状态,0表示不支持旋转。1表示支持旋转。
自动旋转关闭时:
adb shell settings get system user_rotation
用户旋转横竖屏:0表示竖屏,1表示横屏。
自动旋转快打开时:
值为上一次旋转值。
4.3 DisplayRotation.java构造函数中创建了SettingsObserver对象,其observe()方法将监听Settings.System.USER_ROTATION和Settings.System.ACCELEROMETER_ROTATION的值,监听到该值后调用onChange。

在这里插入图片描述在这里插入图片描述

onChange方法,调用updateSettings()方法,最后调用WindowManagerService的更新旋转角度,见6.2方法。
在这里插入图片描述

updateSettings()方法其主要的工作是根据需要监听传感器数据,据此判断是否要转屏,如果传感器传回的值改变,则对configuration的各种更新。函数updateSettings()如它的名字主要更新设置信息。如果UserRotation(朝向信息,如Surface.ROTATION_0)和UserRotationMode(USER_ROTATION_FREE vs. USER_ROTATION_LOCKED)有更新,就设置标记 shouldUpdateRotation 为true表示接下去需要更新rotation相关信息。

5. frameworks/base/services/core/java/com/android/server/wm/DisplayWindowSettings.java

5.1 setUserRotation(DisplayContent displayContent, int rotationMode, int rotation)
在这里插入图片描述

5.2 writeSettingsIfNeeded(Entry changedEntry, DisplayInfo displayInfo)
在这里插入图片描述

5.3writeSettings()
在这里插入图片描述在这里插入图片描述

6.frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

6.1 updateRotation(boolean alwaysSendConfiguration, boolean forceRelayout) 调用当前类的updateRotationUnchecked方法
6.2 updateRotationUnchecked(boolean alwaysSendConfiguration, boolean forceRelayout) 更新未检查的旋转角度
在这里插入图片描述

这篇关于Android 10.0系统自动转屏流程(源码分析)-未完待续的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/997377

相关文章

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.