Android Configuration相关

ops/2024/11/26 23:19:37/

log打印

在日志中经常可以看到打印
WindowManager: Override config changes=20005df8 {0.0 ?mcc?mnc ?localeList ?layoutDir sw294dp w294dp h654dp 587dpi nrml long port ?uimode ?night -touch -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 0 - 1080, 2400) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} ?fontWeightAdjustment} for displayId=2

代码路径:frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java

    int performDisplayOverrideConfigUpdate(Configuration values) {mTempConfig.setTo(getRequestedOverrideConfiguration());final int changes = mTempConfig.updateFrom(values);if (changes != 0) {Slog.i(TAG, "Override config changes=" + Integer.toHexString(changes) + " "+ mTempConfig + " for displayId=" + mDisplayId);if (isReady() && mTransitionController.isShellTransitionsEnabled()) {requestChangeTransitionIfNeeded(changes, null /* displayChange */);}onRequestedOverrideConfigurationChanged(mTempConfig);final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0;if (isDensityChange && mDisplayId == DEFAULT_DISPLAY) {mAtmService.mAppWarnings.onDensityChanged();// Post message to start process to avoid possible deadlock of calling into AMS with// the ATMS lock held.final Message msg = PooledLambda.obtainMessage(ActivityManagerInternal::killAllBackgroundProcessesExcept,mAtmService.mAmInternal, N,ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);mAtmService.mH.sendMessage(msg);}mWmService.mDisplayNotificationController.dispatchDisplayChanged(this, getConfiguration());}return changes;}

一般来说Configuration发生变化时,便会刷新打印关键log:Override config changes
这里的mTempConfig就是Configuration对象,其对应

Configuration

Configuration类则用于描述整个设备或应用的配置信息。它包含了更广泛的属性,如屏幕方向、触摸方式、字体缩放比例、MCC(移动国家码)、MNC(移动网络码)、地区设置、屏幕分辨率(以dp为单位)以及屏幕密度(以dpi为单位)等。

代码路径:frameworks/base/core/java/android/content/res/Configuration.java

/*** This class describes all device configuration information that can* impact the resources the application retrieves.  This includes both* user-specified configuration options (locale list and scaling) as well* as device configurations (such as input modes, screen size and screen orientation).* <p>You can acquire this object from {@link Resources}, using {@link* Resources#getConfiguration}. Thus, from an activity, you can get it by chaining the request* with {@link android.app.Activity#getResources}:</p>* <pre>Configuration config = getResources().getConfiguration();</pre>*/
public final class Configuration implements Parcelable, Comparable<Configuration> {
    public String toString() {StringBuilder sb = new StringBuilder(128);sb.append("{");sb.append(fontScale);sb.append(" ");if (mcc != 0) {sb.append(mcc);sb.append("mcc");} else {sb.append("?mcc");}if (mnc != MNC_ZERO) {sb.append(mnc);sb.append("mnc");} else {sb.append("?mnc");}fixUpLocaleList();if (!mLocaleList.isEmpty()) {sb.append(" ");sb.append(mLocaleList);} else {sb.append(" ?localeList");}if (mGrammaticalGender != 0) {switch (mGrammaticalGender) {case GRAMMATICAL_GENDER_NEUTRAL: sb.append(" neuter"); break;case GRAMMATICAL_GENDER_FEMININE: sb.append(" feminine"); break;case GRAMMATICAL_GENDER_MASCULINE: sb.append(" masculine"); break;case GRAMMATICAL_GENDER_NOT_SPECIFIED: sb.append(" ?grgend"); break;}}int layoutDir = (screenLayout&SCREENLAYOUT_LAYOUTDIR_MASK);switch (layoutDir) {case SCREENLAYOUT_LAYOUTDIR_UNDEFINED: sb.append(" ?layoutDir"); break;case SCREENLAYOUT_LAYOUTDIR_LTR: sb.append(" ldltr"); break;case SCREENLAYOUT_LAYOUTDIR_RTL: sb.append(" ldrtl"); break;default: sb.append(" layoutDir=");sb.append(layoutDir >> SCREENLAYOUT_LAYOUTDIR_SHIFT); break;}if (smallestScreenWidthDp != SMALLEST_SCREEN_WIDTH_DP_UNDEFINED) {sb.append(" sw"); sb.append(smallestScreenWidthDp); sb.append("dp");} else {sb.append(" ?swdp");}if (screenWidthDp != SCREEN_WIDTH_DP_UNDEFINED) {sb.append(" w"); sb.append(screenWidthDp); sb.append("dp");} else {sb.append(" ?wdp");}if (screenHeightDp != SCREEN_HEIGHT_DP_UNDEFINED) {sb.append(" h"); sb.append(screenHeightDp); sb.append("dp");} else {sb.append(" ?hdp");}if (densityDpi != DENSITY_DPI_UNDEFINED) {sb.append(" "); sb.append(densityDpi); sb.append("dpi");} else {sb.append(" ?density");}switch ((screenLayout&SCREENLAYOUT_SIZE_MASK)) {case SCREENLAYOUT_SIZE_UNDEFINED: sb.append(" ?lsize"); break;case SCREENLAYOUT_SIZE_SMALL: sb.append(" smll"); break;case SCREENLAYOUT_SIZE_NORMAL: sb.append(" nrml"); break;case SCREENLAYOUT_SIZE_LARGE: sb.append(" lrg"); break;case SCREENLAYOUT_SIZE_XLARGE: sb.append(" xlrg"); break;default: sb.append(" layoutSize=");sb.append(screenLayout&SCREENLAYOUT_SIZE_MASK); break;}switch ((screenLayout&SCREENLAYOUT_LONG_MASK)) {case SCREENLAYOUT_LONG_UNDEFINED: sb.append(" ?long"); break;case SCREENLAYOUT_LONG_NO: /* not-long is not interesting to print */ break;case SCREENLAYOUT_LONG_YES: sb.append(" long"); break;default: sb.append(" layoutLong=");sb.append(screenLayout&SCREENLAYOUT_LONG_MASK); break;}switch ((colorMode &COLOR_MODE_HDR_MASK)) {case COLOR_MODE_HDR_UNDEFINED: sb.append(" ?ldr"); break; // most likely not HDRcase COLOR_MODE_HDR_NO: /* ldr is not interesting to print */ break;case COLOR_MODE_HDR_YES: sb.append(" hdr"); break;default: sb.append(" dynamicRange=");sb.append(colorMode &COLOR_MODE_HDR_MASK); break;}switch ((colorMode &COLOR_MODE_WIDE_COLOR_GAMUT_MASK)) {case COLOR_MODE_WIDE_COLOR_GAMUT_UNDEFINED: sb.append(" ?wideColorGamut"); break;case COLOR_MODE_WIDE_COLOR_GAMUT_NO: /* not wide is not interesting to print */ break;case COLOR_MODE_WIDE_COLOR_GAMUT_YES: sb.append(" widecg"); break;default: sb.append(" wideColorGamut=");sb.append(colorMode &COLOR_MODE_WIDE_COLOR_GAMUT_MASK); break;}switch (orientation) {case ORIENTATION_UNDEFINED: sb.append(" ?orien"); break;case ORIENTATION_LANDSCAPE: sb.append(" land"); break;case ORIENTATION_PORTRAIT: sb.append(" port"); break;default: sb.append(" orien="); sb.append(orientation); break;}switch ((uiMode&UI_MODE_TYPE_MASK)) {case UI_MODE_TYPE_UNDEFINED: sb.append(" ?uimode"); break;case UI_MODE_TYPE_NORMAL: /* normal is not interesting to print */ break;case UI_MODE_TYPE_DESK: sb.append(" desk"); break;case UI_MODE_TYPE_CAR: sb.append(" car"); break;case UI_MODE_TYPE_TELEVISION: sb.append(" television"); break;case UI_MODE_TYPE_APPLIANCE: sb.append(" appliance"); break;case UI_MODE_TYPE_WATCH: sb.append(" watch"); break;case UI_MODE_TYPE_VR_HEADSET: sb.append(" vrheadset"); break;default: sb.append(" uimode="); sb.append(uiMode&UI_MODE_TYPE_MASK); break;}switch ((uiMode&UI_MODE_NIGHT_MASK)) {case UI_MODE_NIGHT_UNDEFINED: sb.append(" ?night"); break;case UI_MODE_NIGHT_NO: /* not-night is not interesting to print */ break;case UI_MODE_NIGHT_YES: sb.append(" night"); break;default: sb.append(" night="); sb.append(uiMode&UI_MODE_NIGHT_MASK); break;}switch (touchscreen) {case TOUCHSCREEN_UNDEFINED: sb.append(" ?touch"); break;case TOUCHSCREEN_NOTOUCH: sb.append(" -touch"); break;case TOUCHSCREEN_STYLUS: sb.append(" stylus"); break;case TOUCHSCREEN_FINGER: sb.append(" finger"); break;default: sb.append(" touch="); sb.append(touchscreen); break;}switch (keyboard) {case KEYBOARD_UNDEFINED: sb.append(" ?keyb"); break;case KEYBOARD_NOKEYS: sb.append(" -keyb"); break;case KEYBOARD_QWERTY: sb.append(" qwerty"); break;case KEYBOARD_12KEY: sb.append(" 12key"); break;default: sb.append(" keys="); sb.append(keyboard); break;}switch (keyboardHidden) {case KEYBOARDHIDDEN_UNDEFINED: sb.append("/?"); break;case KEYBOARDHIDDEN_NO: sb.append("/v"); break;case KEYBOARDHIDDEN_YES: sb.append("/h"); break;case KEYBOARDHIDDEN_SOFT: sb.append("/s"); break;default: sb.append("/"); sb.append(keyboardHidden); break;}switch (hardKeyboardHidden) {case HARDKEYBOARDHIDDEN_UNDEFINED: sb.append("/?"); break;case HARDKEYBOARDHIDDEN_NO: sb.append("/v"); break;case HARDKEYBOARDHIDDEN_YES: sb.append("/h"); break;default: sb.append("/"); sb.append(hardKeyboardHidden); break;}switch (navigation) {case NAVIGATION_UNDEFINED: sb.append(" ?nav"); break;case NAVIGATION_NONAV: sb.append(" -nav"); break;case NAVIGATION_DPAD: sb.append(" dpad"); break;case NAVIGATION_TRACKBALL: sb.append(" tball"); break;case NAVIGATION_WHEEL: sb.append(" wheel"); break;default: sb.append(" nav="); sb.append(navigation); break;}switch (navigationHidden) {case NAVIGATIONHIDDEN_UNDEFINED: sb.append("/?"); break;case NAVIGATIONHIDDEN_NO: sb.append("/v"); break;case NAVIGATIONHIDDEN_YES: sb.append("/h"); break;default: sb.append("/"); sb.append(navigationHidden); break;}sb.append(" winConfig="); sb.append(windowConfiguration);if (assetsSeq != 0) {sb.append(" as.").append(assetsSeq);}if (seq != 0) {sb.append(" s.").append(seq);}if (fontWeightAdjustment != FONT_WEIGHT_ADJUSTMENT_UNDEFINED) {sb.append(" fontWeightAdjustment=");sb.append(fontWeightAdjustment);} else {sb.append(" ?fontWeightAdjustment");}sb.append('}');return sb.toString();}

常见参数介绍:

  • fontScale:当前用户设置的字体的缩放因子
  • mcc:获取移动信号的国家码
  • mnc:获取移动信号的网络码
  • locale:获取用户当前的语言环境
  • densityDpi:屏幕密度
  • navigation:判断系统上方向导航设备的类型。该属性的返回值:NAVIGATION_NONAV(无导航)、 NAVIGATION_DPAD(DPAD导航)NAVIGATION_TRACKBALL(轨迹球导航)、NAVIGATION_WHEEL(滚轮导航)
    orientation:获取系统屏幕的方向。该属性的返回值:ORIENTATION_LANDSCAPE(横向屏幕)、ORIENTATION_PORTRAIT(竖向屏幕)
  • screenHeightDp,screenWidthDp:屏幕可用高和宽,用dp表示
  • touchscreen:获取系统触摸屏的触摸方式。该属性的返回值:TOUCHSCREEN_NOTOUCH(无触摸屏)、TOUCHSCREEN_STYLUS(触摸笔式触摸屏)、TOUCHSCREEN_FINGER(接收手指的触摸屏)
  • windowConfiguration:窗口相关信息

windowConfiguration

WindowConfiguration是用来描述窗口的配置信息的类,包括窗口的大小、位置、方向、可见性等。WindowConfiguration会在以下情况下更新:

  1. 屏幕方向改变:当设备的屏幕方向发生改变时,WindowConfiguration会更新以反映新的方向。
  2. 窗口大小改变:当窗口的大小发生改变时,WindowConfiguration会更新以反映新的大小。
  3. 窗口位置改变:当窗口的位置发生改变时,WindowConfiguration会更新以反映新的位置。
  4. 窗口可见性改变:当窗口的可见性发生改变时,WindowConfiguration会更新以反映新的可见性。
  5. 窗口类型改变:当窗口的类型发生改变时,WindowConfiguration会更新以反映新的类型。

总之,当窗口的任何配置信息发生改变时,WindowConfiguration都会更新以反映新的配置信息
代码路径:frameworks/base/core/java/android/app/WindowConfiguration.java

/*** Class that contains windowing configuration/state for other objects that contain windows directly* or indirectly. E.g. Activities, Task, Displays, ...* The test class is {@link com.android.server.wm.WindowConfigurationTests} which must be kept* up-to-date and ran anytime changes are made to this class.* @hide*/
@TestApi
public class WindowConfiguration implements Parcelable, Comparable<WindowConfiguration> {
    @Overridepublic String toString() {return "{ mBounds=" + mBounds+ " mAppBounds=" + mAppBounds+ " mMaxBounds=" + mMaxBounds+ " mDisplayRotation=" + (mRotation == ROTATION_UNDEFINED? "undefined" : rotationToString(mDisplayRotation))+ " mWindowingMode=" + windowingModeToString(mWindowingMode)+ " mDisplayWindowingMode=" + windowingModeToString(mDisplayWindowingMode)+ " mActivityType=" + activityTypeToString(mActivityType)+ " mAlwaysOnTop=" + alwaysOnTopToString(mAlwaysOnTop)+ " mRotation=" + (mRotation == ROTATION_UNDEFINED? "undefined" : rotationToString(mRotation))+ "}";}

常见参数介绍:

  • mWindowingMode:窗口模式,用于描述窗口的显示方式,包括以下几种模式: - WINDOWING_MODE_UNDEFINED:未定义的窗口模式。 - WINDOWING_MODE_FULLSCREEN:全屏模式,窗口将占据整个屏幕。 - WINDOWING_MODE_SPLIT_SCREEN_PRIMARY:分屏模式,窗口将占据屏幕的一半。 - WINDOWING_MODE_SPLIT_SCREEN_SECONDARY:分屏模式,窗口将占据屏幕的另一半。 - WINDOWING_MODE_FREEFORM:自由形式模式,窗口可以自由调整大小和位置。
  • mActivityType:活动类型,用于描述窗口所属的活动类型,包括以下几种类型: - ACTIVITY_TYPE_UNDEFINED:未定义的活动类型。 - ACTIVITY_TYPE_STANDARD:标准活动类型,即普通的Activity。 - ACTIVITY_TYPE_HOME:主页活动类型,即Launcher。 - ACTIVITY_TYPE_RECENTS:最近使用的活动类型,即Recents。 - ACTIVITY_TYPE_ASSISTANT:助手活动类型,即Assistant。
  • mRotation:屏幕方向,用于描述窗口所处的屏幕方向,包括以下几种方向: - ROTATION_UNDEFINED:未定义的屏幕方向。 - ROTATION_0:竖屏方向。 - ROTATION_90:横屏方向。 - ROTATION_180:反向竖屏方向。 - ROTATION_270:反向横屏方向。
  • mBounds:窗口边界,用于描述窗口的位置和大小。
  • mAppBounds:应用边界,用于描述应用的位置和大小。
  • mAlwaysOnTop:是否始终置顶,用于描述窗口是否始终置顶。
    isAlwaysOnTop():判断是否置顶
  • isFloating():是否浮动,用于描述窗口是否浮动。

http://www.ppmy.cn/ops/136938.html

相关文章

redis的List底层数据结构 分别什么时候使用双向链表(Doubly Linked List)和压缩列表(ZipList)

在Redis中&#xff0c;List数据类型的底层数据结构可以在压缩列表&#xff08;ZipList&#xff09;和双向链表&#xff08;Doubly Linked List&#xff09;之间选择。以下是它们各自使用的条件&#xff1a; 1. **使用ZipList&#xff08;压缩列表&#xff09;的条件**&#xf…

web组态软件

1、强大的画面显示web组态功能 2、良好的开放性。 开放性是指组态软件能与多种通信协议互联&#xff0c;支持多种硬件设备&#xff0c;向上能与管理层通信&#xff0c;实现上位机和下位机的双向通信。 3、丰富的功能模块。 web组态提供丰富的控制功能库&#xff0c;满足用户的测…

Python操作neo4j库py2neo使用(一)

Python操作neo4j库py2neo使用&#xff08;一&#xff09; 安装&#xff08;只用于测试&#xff09; docker-compose .yml 文件 version: 3.8 services:neo4j:image: neo4j:5.6.0-enterprise #商业版镜像hostname: neo4jcontainer_name: neo4jports:- "7474:7474"-…

【linux013】文件操作命令篇 - less 命令

文章目录 less 命令1、基本用法2、常见选项3、交互式键盘命令4、举例5、注意事项 less 命令 less 是 Linux 中强大的文件分页查看命令&#xff0c;比 more 更灵活且功能更强大。less 支持双向滚动、搜索、显示大文件等功能&#xff0c;适用于查看文件内容或管道输出的大量文本…

嵌入式AI之rknn yolov5初探

本文主要记录在RK3588上跑通RKNUP的rknn_yolov5_demo的过程,并且对rknn_yolov5_demo的代码进行修改,实现在显示器上同步播放rknn_yolov5_demo视频流检测结果。 首先,是RKNUP SDK的编译,参考官方SDK中的README.md文档,下载好对应的sdk编译工具链,我这边使用的是debian系统…

【Python】构建事件驱动架构:用Python实现实时应用的高效系统

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 事件驱动架构(Event-Driven Architecture,EDA)是一种基于事件流动进行系统设计的模式,广泛应用于游戏开发、实时监控和分布式系统中。它通过解耦事件的生产者和消费者,提升系统的可扩展性和灵活性。本文章从…

高标准农田智慧农业系统建设方案

1 项目概述 1.1 建设背景 我国是农业大国,近30年来农田高产量主要依靠农药化肥的大量投入,大部分化肥和水资源没有被有效利用而随地弃置,导致大量养分损失并造成环境污染。我国农业生产仍然以传统生产模式为主,传统耕种只能凭经验施肥灌溉,不仅浪费大量的人力物力,也对环…

3D可视化引擎HOOPS Luminate场景图详解:形状的创建、销毁与管理

本文详细介绍了HOOPS Luminate API的场景图部分。场景图是定义要显示的2D或3D世界的关键元素。在本文的过程中&#xff0c;我们将回顾HOOPS Luminate场景图的所有不同对象&#xff0c;并了解如何将它们组织在一起。 HOOPS Luminate场景图对象分为两类&#xff1a; 形状&#…