前言

屏幕超时休眠指的是在设备一段时间没有操作后,自动关闭屏幕显示以节省电量并防止误触。当屏幕进入休眠状态时,通常会关闭屏幕背光,但设备可能仍在运行后台进程。

正文

Settings应用相关

Settings应用的屏幕超时休眠界面相关代码定位到:

packages/apps/Settings/res/xml/display_settings.xml

屏幕超时休眠的控件的key值为screen_timeout。屏幕超时休眠列表选项信息,根据key值找到控件,随后根据android:entries和android:entryValues相关代码定位到:

packages/apps/Settings/res/values/arrays.xml

相关Controller代码定位到:

packages/apps/Settings/src/com/android/settings/display/TimeoutPreferenceController.java

@Override
public void updateState(Preference preference) {
final TimeoutListPreference timeoutListPreference = (TimeoutListPreference) preference;
final long currentTimeout = Settings.System.getLong(mContext.getContentResolver(),
SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE);//获取到设置的屏幕超时休眠时间
timeoutListPreference.setValue(String.valueOf(currentTimeout));
final DevicePolicyManager dpm =
(DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
if (dpm != null) {
final RestrictedLockUtils.EnforcedAdmin admin =
RestrictedLockUtils.checkIfMaximumTimeToLockIsSet(mContext);
final long maxTimeout =
dpm.getMaximumTimeToLock(null /* admin */, UserHandle.myUserId());
timeoutListPreference.removeUnusableTimeouts(maxTimeout, admin);
}
updateTimeoutPreferenceDescription(timeoutListPreference, currentTimeout);//更新屏幕超时休眠时间描述 EnforcedAdmin admin = RestrictedLockUtils.checkIfRestrictionEnforced(
mContext, UserManager.DISALLOW_CONFIG_SCREEN_TIMEOUT,
UserHandle.myUserId());
if(admin != null) {
timeoutListPreference.removeUnusableTimeouts(0/* disable all*/, admin);
}
} @Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
try {
int value = Integer.parseInt((String) newValue);//获取到设置的新的屏幕超时休眠时间
Settings.System.putInt(mContext.getContentResolver(), SCREEN_OFF_TIMEOUT, value);//设置新的屏幕超时休眠时间
updateTimeoutPreferenceDescription((TimeoutListPreference) preference, value);//更新屏幕超时休眠时间描述
} catch (NumberFormatException e) {
Log.e(TAG, "could not persist screen timeout setting", e);
}
return true;
} //更新屏幕超时休眠时间描述
private void updateTimeoutPreferenceDescription(TimeoutListPreference preference,
long currentTimeout) {
final String summary;
// 省略部分源代码
preference.setSummary(summary);//设置描述信息
}

属性值相关

屏幕超时休眠默认时间,定位到:

frameworks/base/packages/SettingsProvider/res/values/defaults.xml

<integer name="def_screen_off_timeout">15000</integer>

默认时间属性值是写在SQLite中,具体详情见:

packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

屏幕超时休眠默认最低时间,定位到:

frameworks/base/core/res/res/values/config.xml

<!-- User activity timeout: Minimum screen off timeout in milliseconds.

     Sets a lower bound for the {@link Settings.System#SCREEN_OFF_TIMEOUT} setting
which determines how soon the device will go to sleep when there is no
user activity. This value must be greater than zero, otherwise the device will immediately
fall asleep again as soon as it is awoken.
-->
<integer name="config_minimumScreenOffTimeout">10000</integer>

由上述注释信息,可知屏幕超时休眠默认最低时间需要设置在 \(0\) 以上。既然如此,我们如果设置的值是一个小于最低默认值的数值,甚至是一个小于等于 \(0\) 的数值又会发生什么事情呢?

在framework/base目录下搜 \(screen\_off\_timeout\) 可以定位到:

core/java/android/provider/Settings.java

public static final String SCREEN_OFF_TIMEOUT = "screen_off_timeout";
private static final Validator SCREEN_OFF_TIMEOUT_VALIDATOR = NON_NEGATIVE_INTEGER_VALIDATOR;//屏幕超时休眠时间校验器
//省略部分源代码
static {
//省略部分源代码
VALIDATORS.put(SCREEN_OFF_TIMEOUT, SCREEN_OFF_TIMEOUT_VALIDATOR);//添加校验器
//省略部分源代码
}

于是查看校验器NON_NEGATIVE_INTEGER_VALIDATOR相关代码,定位到:

framework/base/core/java/android/provider/SettingsValidators.java

public static final Validator NON_NEGATIVE_INTEGER_VALIDATOR = new Validator() {
@Override
public boolean validate(@Nullable String value) {
try {
return Integer.parseInt(value) >= 0;
} catch (NumberFormatException e) {
return false;
}
}
};

由上述校验器代码可知,若传入的值是个负数,校验器会对传入的值进行异常抛出,保证代码不崩溃。

项目实战

修改休眠时间列表

根据Settings应用的xml界面的android:entries和android:entryValues相关代码定位到:

packages/apps/Settings/res/values/arrays.xml

直接添加item即可。

若新增的item的value低于屏幕超时休眠默认最低时间,需要修改系统默认最低值

frameworks/base/core/res/res/values/config.xml

<integer name="config_minimumScreenOffTimeout">10000</integer>

修改系统默认屏幕超时休眠时间

修改defaults.xml下的def_screen_off_timeout属性值即可。

frameworks/base/packages/SettingsProvider/res/values/defaults.xml

<integer name="def_screen_off_timeout">15000</integer>

三方app自定义屏幕超时休眠时间

首先,在Settings应用中添加一个广播,在源代码中添加一个action来接收即可,定位到路径:

packages/apps/Settings/AndroidManifest.xml

<!--  找到一个已有的receiver,或者新增一个receiver都是可行的,随后声明一个自定义ACTION  -->
<receiver android:name=".SettingsInitialize">
<intent-filter>
<action android:name="自定义ACTION"/>
<action android:name="android.intent.action.USER_INITIALIZE"/>
<action android:name="android.intent.action.PRE_BOOT_COMPLETED"/>
</intent-filter>
</receiver>

在广播接收器的类中实现接收的逻辑

packages/apps/Settings/src/com/android/settings/SettingsInitialize.java

@Override
public void onReceive(Context context, Intent broadcast) {
//begin:新增的代码
String action = broadcast.getAction();
if (context.getString(自定义ACTION的字符串资源路径).equals(action)) {
final long currentTimeout = Settings.System.getLong(context.getContentResolver(),
SCREEN_OFF_TIMEOUT, TimeoutPreferenceController.FALLBACK_SCREEN_TIMEOUT_VALUE);
int value = broadcast.getIntExtra("screen_off_timeout", (int)currentTimeout);
Settings.System.putInt(context.getContentResolver(), SCREEN_OFF_TIMEOUT, value);
return ;
}
//end:新增的代码
final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
UserInfo userInfo = um.getUserInfo(UserHandle.myUserId());
final PackageManager pm = context.getPackageManager();
managedProfileSetup(context, pm, broadcast, userInfo);
webviewSettingSetup(context, pm, userInfo);
refreshExistingShortcuts(context);
}

在自己的三方应用中添加如下核心代码

Intent screenTimeoutIntent = new Intent("自定义ACTION");
int value = 20000;//新定义的屏幕超时休眠时间
screenTimeoutIntent.putExtra("screen_off_timeout", value);
//若Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND找不到,就用0x01000000硬编码替换
screenTimeoutIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
sendBroadcast(screenTimeoutIntent);//发出广播,通知更新屏幕超时休眠时间

若是希望可以自定义的屏幕超时休眠时间可以低于系统默认最低超时休眠时间,则需要连同系统默认休眠时间一起修改。

【Android】屏幕超时休眠的更多相关文章

  1. Android屏幕禁止休眠的方法

    实现这一功能的方法有两种,一种是在Manifest.xml文件里面声明,一种是在代码里面修改LayoutParams的标志位.具体如下: 1.在Manifest.xml文件里面用user-permis ...

  2. Android屏幕相关设置

    锁屏设置: 1. 初始值 : <integer name="def_screen_off_timeout">60000</integer> 2. 数据库/d ...

  3. Expo大作战(三十四)--expo sdk api之LinearGradient(线性渐变),KeepAwake(保持屏幕不休眠),IntentLauncherAndroid,Gyroscope,

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  4. 基于ContentObserver来动态取消或加入屏幕超时任务

    前面也说了.ContentObserver能够来监控数据库里某一项数据的变化,当然也能够同一时候监控多个数据项的变化. 笔者在项目中须要改动到屏幕超时的需求,比方在车载业务中,倒车事件发生的时候,是不 ...

  5. Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

    的最佳方案 标签: Android屏幕旋转AsyncTaskProgressDialog 2014-07-19 09:25 39227人阅读 评论(46) 收藏 举报 分类: [android 进阶之 ...

  6. android 屏幕分辨率 更改

    手头上有一个320x240的LCD.运行android时,显示内容过大,需要更改屏幕的分辨率. 参考链接 http://www.bkjia.com/Androidjc/899396.html http ...

  7. Android屏幕适配全攻略 (转载)

    http://blog.csdn.net/jdsjlzx/article/details/45891551 https://github.com/hongyangAndroid/AndroidAuto ...

  8. 【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

    来源:http://blog.csdn.net/zhaokaiqiang1992 更多:Android AutoLayout全新的适配方式, 堪称适配终结者 Android的屏幕适配一直以来都在折磨着 ...

  9. Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  10. Android屏幕适配全攻略(最权威的官方适配指导) (转)

    招聘信息: Cocos2d-X 前端主程 [新浪微博]手机客户端iOS研发工程师 20k-40k iOS 开发工程师 iOS高级开发工程师(中国排名第一的企业级移动互联网云计算公司 和创科技 红圈营销 ...

随机推荐

  1. 使用Minio Clinet将老版本Minio的数据迁移到新版本的Minio

    1. 关于Minio Client: MinIO Client是一个命令行工具,用于与Minio或云存储服务进行交互.它支持文件系统和Amazon S3兼容的云存储服务(AWS Signature v ...

  2. LinerProgression

    手动实现线性回归 点击查看代码 import torch import pandas as pd import numpy as np import matplotlib.pyplot as plt ...

  3. C#实现信创国产Linux桌面录制成MP4(源码,银河麒麟、统信UOS)

    信创国产化已是大势所趋,在国产操作系统上的应用开发的需求越来越多,比如,有客户需要在银河麒麟和统信UOS上实现录制桌面生成一个mp4文件.那么这个要如何实现了? 一. 技术方案 要完成这些功能,具体来 ...

  4. 如何理解iowait

    Linux中,%iowait 过高可能是个问题,严重的时候,它能使服务停止, 但问题是,多高才算高? 什么时候应该担心呢? 本文将讨论 iowait 的含义.相关的统计数据.原理以及 iowait的瓶 ...

  5. C# webapi 跨域

    #region 启用跨域访问 app.UseCors(builder => builder .AllowAnyMethod() .SetIsOriginAllowed(_ => true) ...

  6. Linux 系统常见 的命令

    uname -a 查看linux 的版本信息 : pwd :打印当前的工作目录 ,print work directory: cd  改变目录 ,change directory : cd . 当前目 ...

  7. 常见函数 ,过滤函数 直接导入使用 ,filters.js 文件 批量注册过滤器

    // import parseTime, formatTime and set to filter /** * Show plural label if time is plural number * ...

  8. LEAP: Learning to Prescribe Effective and Safe Treatment Combinations for Multimorbidity

    LEAP: Learning to Prescribe Effective and Safe Treatment Combinations for Multimorbidity Authors: Yu ...

  9. spring boot 向nacos注册方式,以及遇见的报错(boot!boot! 不是cloud!)

    一.首先添加nacos注册发现的pom依赖 <dependency> <groupId>com.alibaba.boot</groupId> <artifac ...

  10. 云原生周刊: 使用 Kubectl 执行 100 个 Kubernetes 诊断命令 | 2023.10.23

    开源项目推荐 Stern Stern 是一个针对 Kubernetes 的多 pod 和容器日志跟踪工具.可以跟踪 Kubernetes 上的多个 pod 和 pod 中的多个容器.每个结果都用颜色编 ...