Android强制设置所有应用显示方向,忽略应用本身的设置

news/2024/9/19 8:19:16/ 标签: android

在ROM定制系统开发过程中经常会遇到需要改变第三方应用显示方向的需求,比如抖音这种手机APP都是强制竖屏的,不会跟随屏幕旋转。但在一些平板方案开发中需要能横屏显示,或者需要跟随屏幕旋转方向动态切换横竖屏显示。这时就需要在系统层面去处理了。

先梳理一下屏幕旋转时系统处理的大致流程:

Android 屏幕旋转处理是一个涉及硬件、系统服务、应用层的复杂过程。以下是屏幕旋转处理流程的概述:

  1. 硬件层 (G-sensor):设备中的加速度传感器(G-sensor)检测到物理方向和加速度变化,判断设备的旋转方向 。

  2. 系统服务 (Sensor Service):Sensor Service 管理和提供传感器数据。当 G-sensor 检测到方向变化时,数据会传递到 Sensor Service 。

  3. 方向监听器 (Orientation Listener):应用可以注册方向监听器来监听设备的方向变化,通过 Sensor Service 获取传感器数据,并计算设备的方向 。

  4. 窗口管理器 (Window Manager):窗口管理器负责处理屏幕旋转,调整显示方向以确保用户界面正确显示 。

  5. 配置改变 (Configuration Change):屏幕旋转会触发应用的配置改变事件,导致活动(Activity)重新创建,并触发 onConfigurationChanged 回调 。

  6. Activity 生命周期处理:屏幕旋转导致配置改变时,活动会经历生命周期的重新创建阶段,如 onDestroyonCreateonStartonResume

  7. 重新绘制界面:屏幕旋转后,系统请求重新绘制界面以适应新的方向,应用的布局会根据新的配置进行重新计算和绘制 。

  8. 处理保存的状态:应用需要处理保存和恢复状态,以确保用户数据的连续性,Android 提供了 onSaveInstanceStateonRestoreInstanceState 方法 。

在代码层面,可以通过 setRequestedOrientation 方法设置屏幕方向,此方法等同于在 AndroidManifest.xml 中设置 android:screenOrientation 属性 。设置之后,可以通过 onConfigurationChanged 方法来响应方向变化 。

另外,系统设置中的自动旋转开关会影响应用的屏幕旋转行为。当自动旋转关闭时,无论设备如何旋转,应用界面都不会旋转,除非应用通过代码强制旋转 。用户可以通过下拉通知栏快速切换自动旋转的开启和关闭 。

我们需要做的是在上述第4步中处理,具体修改如下:

frameworks\base\services\core\java\com\android\server\wm\DisplayRotation.java中的

rotationForOrientation(@ScreenOrientation int orientation,@Surface.Rotation int lastRotation)方法就是处理应用中的显示方向设置的,第一个参数orientation就是应用设置的方向,在此方法中进行拦截重写即可。代码如下:

/*** Given an orientation constant, returns the appropriate surface rotation, taking into account* sensors, docking mode, rotation lock, and other factors.** @param orientation  An orientation constant, such as*                     {@link ActivityInfo#SCREEN_ORIENTATION_LANDSCAPE}.* @param lastRotation The most recently used rotation.* @return The surface rotation to use.*/@VisibleForTesting@Surface.Rotationint rotationForOrientation(@ScreenOrientation int orientation,@Surface.Rotation int lastRotation) {ProtoLog.v(WM_DEBUG_ORIENTATION,"rotationForOrientation(orient=%s (%d), last=%s (%d)); user=%s (%d) %s",ActivityInfo.screenOrientationToString(orientation), orientation,Surface.rotationToString(lastRotation), lastRotation,Surface.rotationToString(mUserRotation), mUserRotation,mUserRotationMode == WindowManagerPolicy.USER_ROTATION_LOCKED? "USER_ROTATION_LOCKED" : "");// 重置orientation,强制所有应用跟随屏幕旋转,也可以设置成强制横屏或竖屏固定orientation = ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR;//在系统原有的检查是否设置了固定屏幕之前设置,否则系统设置中的开关就无效了if (isFixedToUserRotation()) { return mUserRotation;}int sensorRotation = mOrientationListener != null? mOrientationListener.getProposedRotation() // may be -1: -1;if (sensorRotation < 0) {sensorRotation = lastRotation;}...
}

这里顺带记录一下我开发过程中遇到的另一个问题,有些设备屏幕旋转后不会回调

onConfigurationChanged()方法,而是重新走onCreate()流程了,Manifest中开始是这样设置的:
android:configChanges="orientation|screenSize",此设置大部分设置都可以正常回调,后来查询得知加上screenLayout配置就都可以了,如下:
android:configChanges="orientation|screenSize|screenLayout"

http://www.ppmy.cn/news/1520453.html

相关文章

萌新6:16进制世界(dp)

题目描述 这是一个16进制的世界&#xff0c;比如522的16进制是20A。 在5月22日那天&#xff0c;有人送给Bob一些月饼&#xff0c;每个月饼有饱食度和幸福度两个属性。 现在Bob有nnn个月饼&#xff0c;对于每个月饼iii&#xff0c;饱食度为viv_ivi​&#xff0c;幸福度为wiw_iw…

未来城市生活:科技与人文的交响

随着技术的发展&#xff0c;未来的城市生活正在以前所未有的速度演变。从智能家居到绿色能源解决方案&#xff0c;再到增强现实&#xff08;AR&#xff09;技术的应用&#xff0c;每一个方面都在重新定义我们对日常生活的认知。本文将探讨这些变化&#xff0c;并展望一个更加智…

3分钟快速本地搭建RSShub服务器并结合内网穿透实现无公网IP远程访问

文章目录 前言1. Docker 安装2. Docker 部署Rsshub3. 本地访问Rsshub4. Linux安装Cpolar5. 配置公网地址6. 远程访问Rsshub7. 固定Cpolar公网地址8. 固定地址访问 前言 今天和大家分享的是如何在本地快速简单部署Rsshub工具&#xff0c;并结合cpolar内网穿透工具使用公网地址远…

C语言——指针专题

1.指针变量 指针变量是用来存储地址值的变量 #include<stdio.h> int main() {int a 10;int* pa &a;//1.这里*表示pa是指针变量//2.int表示pa指向的变量a的类型是int return 0; } 指针变量也是一种变量&#xff0c;这种变量可以用来存放地址的&#xff0c;存放…

【优化】Nginx 配置页面请求不走缓存 浏览器页面禁用缓存

【优化】Nginx 配置页面请求不走缓存 禁用缓存 目录 【优化】Nginx 配置页面请求不走缓存 禁用缓存 对所有请求禁用缓存 对特定location禁用缓存 注意事项 全局禁用缓存 要配置Nginx使其不缓存内容&#xff0c;通常是指禁止浏览器缓存响应的内容&#xff0c;或者是在代理…

JavaEE-servlet

JavaEE 1.创建JavaEE程序 package com.ffyc.dormServer.web; ​ import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServ…

Nvidia股价前景引投资者情绪波动:杠杆ETF数据透视市场风向

一、Nvidia业绩前瞻&#xff1a;看跌情绪升温 随着Nvidia&#xff08;NVDA&#xff09;季度业绩发布日的临近&#xff0c;市场中的投资者情绪似乎正经历着微妙的变化。据多家发行杠杆型交易所交易基金&#xff08;ETF&#xff09;的机构数据显示&#xff0c;投资者对看跌Nvidia…

【Dash】feffery_antd_components 模块中的布局

一、各个组件在布局中担任不同的角色 在 feffery_antd_components 模块中&#xff0c;AntdSpace、AntdRow、AntdCol、AntdLayout、AntdAffix 这些组件在布局中各自承担不同的角色&#xff1a; 1、AntdSpace 组件 主要用于快捷对一组元素进行水平或竖直方向上的规整排列。它可…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(KNN分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#xff08;KNN分类器&#xff09; 文章目录 一、基本原理原理流程举个例子总结 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#x…

【Rust光年纪】探索Rust中的物理引擎库:功能、安装与API概览

助力游戏开发&#xff1a;Rust中几款强大的物理引擎库介绍 前言 随着Rust编程语言的日益流行&#xff0c;越来越多的开发者开始在Rust中构建游戏和图形应用程序。物理引擎是这些应用程序中不可或缺的一部分&#xff0c;而Rust社区也涌现出许多优秀的物理引擎库&#xff0c;本…

【科研绘图】【3D轨线图】:附Origin详细画图流程

目录 No.1 理解3D轨线图 No.2 画图流程 1 导入数据并绘图 2 设置绘图细节 3 设置坐标轴 4 效果图 No.1 理解3D轨线图 3D轨线图&#xff0c;是指在三维坐标系中&#xff0c;通过连续的点或线段连接而成的图形&#xff0c;用于表示一个或多个物体在三维空间中的运动路径。…

git branch 不显示分支名称

如果在使用 git branch 或 git status 时无法显示分支名称&#xff0c;可能有以下几种原因。以下是常见的原因和解决方法&#xff1a; 1. 检查是否在 Git 仓库中 确保你在一个有效的 Git 仓库目录下。运行以下命令来确认&#xff1a; git status如果你看到类似于 fatal: not…

Verilog刷题笔记62

题目: Exams/review2015 fancytimer This is the fifth component in a series of five exercises that builds a complex counter out of several smaller circuits. You may wish to do the four previous exercises first (counter, sequence recognizer FSM, FSM delay, an…

黑马大事件

项目介绍 演示网站&#xff1a; https://fe-bigevent-web.itheima.net/login 实现 1&#xff09;创建项目 npm init vuelatest2&#xff09;安装项目需要的依赖 npm install element-plus --save npm install axios npm install sass -D3&#xff09;在main.js中加入Elem…

低代码用户中心的构建与应用

引言 在现代软件开发中&#xff0c;低代码平台因其高效、灵活、用户友好的特性而逐渐受到青睐。特别是在用户中心的构建方面&#xff0c;低代码平台能够显著提升开发效率&#xff0c;降低开发成本。本文将探讨如何利用低代码平台构建一个高效的用户中心&#xff0c;并分享一些…

记录工作时的一些错误

1、mobaxterm问题&#xff1a; 解决方案&#xff1a;找不到mottynew.exe 2、虚拟机安装centos7进入不了引导页面 解决方案&#xff1a;检查镜像 虚拟机 192.168.40.128 root/Root yxr/y123x123r123 解决方案&#xff1a; 问题&#xff1a;docker run不起来容器&#xff0c;显…

计算机视觉软件教学平台

1、基本介绍 计算机视觉软件教学平台是中智讯公司开发的一款面向人工智能相关专业机器视觉方向的综合型实验平台&#xff0c;主要满足&#xff1a;图像处理、图像识别、机器视觉应用、边缘计算应用、智能算法等课程的实验和实训&#xff0c;是基于新工科和工程教育思维和专业改…

MATLAB 中的对数计算

在 MATLAB 中&#xff0c;计算对数是进行数学分析和科学计算的常见需求。对数运算在数据分析、信号处理和控制系统中都有广泛应用。本篇博客将详细介绍如何在 MATLAB 中进行对数计算&#xff0c;包括自然对数、常用对数以及任意底数的对数。 1. 自然对数&#xff08;以 e 为底…

Spark-Yarn模式如何配置历史服务器

在Spark程序结束之后我们也想看到运行过程怎么办&#xff1f; Yarn模式下&#xff0c;通过以下步骤配置历史服务器即可: mv spark-defaults.conf.template spark-defaults.conf修改spark-default.conf 文件&#xff0c;配置日志存储路径 spark.eventLog.enabled true spark.…

xxxSendMessageBSM函数分析

BSM的意思&#xff1a;Broadcast Special Message 第一部分A&#xff1a; //Broadcast Special Message Recipient list #define BSM_ALLCOMPONENTS 0x00000000 #define BSM_VXDS 0x00000001 #define BSM_NETDRIVER 0x00000002 #define BSM_INS…