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

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

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

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) 更新未检查的旋转角度
在这里插入图片描述

### 回答1: 在Android 10.0系统中,可以通过以下步骤实现USB转网口默认固定IP地址的设置: 1. 连接USB转网口设备到Android设备。 2. 在Android设备中打开“设置”应用程序,点击“网络和互联网”选项。 3. 在“网络和互联网”选项中,选择“热点与共享”选项。 4. 在“热点与共享”选项中,选择“USB网络共享”选项。 5. 在“USB网络共享”选项中,开启“USB Tethering”选项,然后点击“USB网口设置”选项。 6. 在“USB网口设置”选项中,选择“静态IP”选项。 7. 在“静态IP”选项中,输入所需的IP地址、子网掩码和网关信息。 8. 点击“保存”按钮完成设置。 经过以上步骤后,Android设备就会将USB转网口设备连接到静态IP地址,并且该设置将在以后的使用中保持不变。需要注意的是,确保所设置的固定IP地址与其他设备使用的IP地址不冲突,以免出现网络连接问题。 ### 回答2: Android 10.0系统的USB转网口默认情况下是动态获取IP地址的,如果需要设置固定IP地址,可以按照以下步骤进行: 1. 连接设备并打开USB调试模式,可以在设置->开发者选项中找到该选项。 2. 打开电脑的命令提示符或终端工具,输入“adb devices”命令,确认设备连接成功。 3. 在终端中输入“adb shell”,进入设备的shell模式。 4. 输入“su”命令,获取root权限。 5. 输入“netcfg”,查看当前所有网络接口及其状态。 6. 根据需要的网络接口,确定其接口名称。一般为“rndis0”或“rmnet0”。 7. 输入“ifconfig [接口名称] [IP地址] netmask [子网掩码] up”命令,设置IP地址与子网掩码。例如:ifconfig rndis0 192.168.1.100 netmask 255.255.255.0 up。 8. 输入“route add default gw [网关地址] [接口名称]”命令,设置默认网关。例如:route add default gw 192.168.1.1 rndis0。 9. 输入“setprop net.dns1 [首选DNS服务器地址]”命令,设置DNS服务器地址。例如:setprop net.dns1 8.8.8.8。 10. 使用ping命令测试网络连接是否正常,例如:ping baidu.com。 以上是Android 10.0系统USB转网口设置固定IP地址的步骤,需要注意的是,该设置仅在当前USB网络连接下有效,并且用户需要具备一定的命令行操作经验。在进行设置时,应根据实际情况进行调整。 ### 回答3: Android 10.0系统的USB转网口功能可以把手机当成一个有线网络适配器使用,将手机通过USB接口与电脑相连,从而实现电脑通过手机进行有线网络访问的功能。要设置USB转网口默认的固定IP地址,可以按照以下步骤进行操作: 1. 打开设置菜单,在“网络和互联网”选项下找到“热点和网络共享”设置,打开该设置。 2. 在热点和网络共享页面中找到“USB网络共享”选项,开启USB网络共享功能。 3. 在“USB网络共享”选项的设置页面中,找到“USB Tethering设置”选项,点击进入。 4. 在“USB Tethering设置”页面中,可以看到“USB网络共享配置”设置项,点击该设置项。 5. 在“USB网络共享配置”设置页面中,可以设置USB网络共享的IP地址、子网掩码、网关、DNS等参数。在IP地址设置中选择“静态”方式,手动设置需要设置的固定IP地址。 6. 完成上述设置后,重新连接电脑和手机的USB接口,电脑会自动获取到设置的固定IP地址,实现USB转网口的固定IP地址功能。 需要注意的是,如果设置的固定IP地址与网络中其他设备的IP地址冲突,就可能会导致无法连接网络或无法正常访问网络。因此,在设置固定IP地址时,需要确保设置的IP地址在网络中是唯一的,避免冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值