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

相关文章

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意