小工具知识网

当前位置: 首页 > 行业知识 > 屏幕超时休眠-Android13

行业知识

屏幕超时休眠-Android13

2026-11-09 06:39:52 来源:互联网转载

屏幕超时休眠-Android13

  • 1、设置界面
    • 1.2 属性值
      • 1.2.1 默认值
      • 1.2.2 最小值限制
      • 1.3 属性值疑问 Settings.System.SCREEN_OFF_TIMEOUT
      • 2、超时灭屏
        • 2.1 锁定屏幕的超时
        • 2.2 屏幕灭屏的超时
        • 3、永不休眠
        • * 关键日志

          1、设置界面

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

          packages/apps/Settings/res/xml/screen_timeout_settings.xml

          12-16 12:13:54.707  7976  7976 D SettingsActivity: Switching to fragment com.android.settings.display.ScreenTimeoutSettings

          1.2 属性值

          Settings.System.SCREEN_OFF_TIMEOUT

          adb shell settings get System screen_off_timeout

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

                          15 seconds        30 seconds        1 minute        2 minutes        5 minutes        10 minutes        30 minutes                            15000                30000                60000                120000                300000                600000                1800000    

          1.2.1 默认值

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

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

              private void loadSystemSettings(SQLiteDatabase db) {        SQLiteStatement stmt = null;        try {            stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"                    + " VALUES(?,?);");            loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,                    R.bool.def_dim_screen);            loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,                    R.integer.def_screen_off_timeout);            // Set default cdma DTMF type            loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);            // Set default hearing aid            loadSetting(stmt, Settings.System.HEARING_AID, 0);            // Set default tty mode            loadSetting(stmt, Settings.System.TTY_MODE, 0);            loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,                    R.integer.def_screen_brightness);            loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_FOR_VR,                    com.android.internal.R.integer.config_screenBrightnessForVrSettingDefault);            loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,                    R.bool.def_screen_brightness_automatic_mode);            loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,                    R.bool.def_accelerometer_rotation);            loadIntegerSetting(stmt, Settings.System.USER_ROTATION, R.integer.def_user_rotation);            loadDefaultHapticSettings(stmt);            loadBooleanSetting(stmt, Settings.System.NOTIFICATION_LIGHT_PULSE,                    R.bool.def_notification_pulse);            loadUISoundEffectsSettings(stmt);            loadIntegerSetting(stmt, Settings.System.POINTER_SPEED,                    R.integer.def_pointer_speed);            /*             * IMPORTANT: Do not add any more upgrade steps here as the global,             * secure, and system settings are no longer stored in a database             * but are kept in memory and persisted to XML.             *             * See: SettingsProvider.UpgradeController#onUpgradeLocked             */        } finally {            if (stmt != null) stmt.close();        }    }

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

          60000

          1.2.2 最小值限制

          frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

          mMinimumScreenOffTimeoutConfig = resources.getInteger(com.android.internal.R.integer.config_minimumScreenOffTimeout);Math.max(timeout, mMinimumScreenOffTimeoutConfig);

          1.3 属性值疑问 Settings.System.SCREEN_OFF_TIMEOUT

          在设置屏幕超时代码代码中,最大值可以为“Long.MAX_VALUE”,属性设置Settings.System.putLong(context.getContentResolver(), SCREEN_OFF_TIMEOUT, value);,但是实质最大值只能是Integer.MAX_VALUE(2147483647);该属性实质在fwk中是Integer保存,获取方式mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver, Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT, UserHandle.USER_CURRENT);

          frameworks/base/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java 中 NON_NEGATIVE_INTEGER_VALIDATOR 检查非法值

              private Long getMaxScreenTimeout(Context context) {        if (context == null) {            return Long.MAX_VALUE;        }        final DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);        if (dpm == null) {            return Long.MAX_VALUE;        }        mAdmin = RestrictedLockUtilsInternal.checkIfMaximumTimeToLockIsSet(context);        if (mAdmin != null) {            return dpm.getMaximumTimeToLock(null /* admin */, UserHandle.myUserId());        }        return Long.MAX_VALUE;    }    private String getCurrentSystemScreenTimeout(Context context) {        if (context == null) {            return Long.toString(FALLBACK_SCREEN_TIMEOUT_VALUE);        } else {            return Long.toString(Settings.System.getLong(context.getContentResolver(),                    SCREEN_OFF_TIMEOUT, FALLBACK_SCREEN_TIMEOUT_VALUE));        }    }    private void setCurrentSystemScreenTimeout(Context context, String key) {        try {            if (context != null) {                final long value = Long.parseLong(key);                mMetricsFeatureProvider.action(context, SettingsEnums.ACTION_SCREEN_TIMEOUT_CHANGED,                        (int) value);                Settings.System.putLong(context.getContentResolver(), SCREEN_OFF_TIMEOUT, value);            }        } catch (NumberFormatException e) {            Log.e(TAG, "could not persist screen timeout setting", e);        }    }

          2、超时灭屏

          2.1 锁定屏幕的超时

          更新延时 mLockScreenTimeout 执行 mScreenLockTimeout

          frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

          mLockScreenTimeout = Settings.System.getIntForUser(resolver,Settings.System.SCREEN_OFF_TIMEOUT, 0, UserHandle.USER_CURRENT);mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout);    class ScreenLockTimeout implements Runnable {        Bundle options;        @Override        public void run() {            synchronized (this) {                if (localLOGV) Log.v(TAG, "mScreenLockTimeout activating keyguard");                if (mKeyguardDelegate != null) {                    mKeyguardDelegate.doKeyguardTimeout(options);                }                mLockScreenTimerActive = false;                mLockNowPending = false;                options = null;            }        }        public void setLockOptions(Bundle options) {            this.options = options;        }    }

          2.2 屏幕灭屏的超时

          updateUserActivitySummaryLocked更新mUserActivitySummary的值,用户活动超时时调用updateUserActivitySummaryLocked,这里获取getScreenOffTimeoutLocked状态更新

          frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

          mScreenOffTimeoutSetting = Settings.System.getIntForUser(resolver, Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT, UserHandle.USER_CURRENT);    @GuardedBy("mLock")    private long getScreenOffTimeoutLocked(long sleepTimeout, long attentiveTimeout) {        long timeout = mScreenOffTimeoutSetting;        if (isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) {            timeout = Math.min(timeout, mMaximumScreenOffTimeoutFromDeviceAdmin);        }        if (mUserActivityTimeoutOverrideFromWindowManager >= 0) {            timeout = Math.min(timeout, mUserActivityTimeoutOverrideFromWindowManager);        }        if (sleepTimeout >= 0) {            timeout = Math.min(timeout, sleepTimeout);        }        if (attentiveTimeout >= 0) {            timeout = Math.min(timeout, attentiveTimeout);        }        return Math.max(timeout, mMinimumScreenOffTimeoutConfig);    }    private void handleUserActivityTimeout() { // runs on handler thread        synchronized (mLock) {            if (DEBUG_SPEW) {                Slog.d(TAG, "handleUserActivityTimeout");            }            mDirty |= DIRTY_USER_ACTIVITY;            updatePowerStateLocked();        }    }    /**     * Updates the value of mUserActivitySummary to summarize the user requested     * state of the system such as whether the screen should be bright or dim.     * Note that user activity is ignored when the system is asleep.     *     * This function must have no other side-effects.     */    @GuardedBy("mLock")    private void updateUserActivitySummaryLocked(long now, int dirty) {        // Update the status of the user activity timeout timer.        if ((dirty & (DIRTY_DISPLAY_GROUP_WAKEFULNESS | DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY                | DIRTY_WAKEFULNESS | DIRTY_SETTINGS | DIRTY_ATTENTIVE)) == 0) {            return;        }        mHandler.removeMessages(MSG_USER_ACTIVITY_TIMEOUT);        final long attentiveTimeout = getAttentiveTimeoutLocked();        final long sleepTimeout = getSleepTimeoutLocked(attentiveTimeout);        long screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout,                attentiveTimeout);        final long screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);        screenOffTimeout =                getScreenOffTimeoutWithFaceDownLocked(screenOffTimeout, screenDimDuration);        final boolean userInactiveOverride = mUserInactiveOverrideFromWindowManager;        long nextTimeout = -1;        boolean hasUserActivitySummary = false;        for (int idx = 0; idx = powerGroup.getLastWakeTimeLocked()) {                    groupNextTimeout = lastUserActivityTime + screenOffTimeout - screenDimDuration;                    if (now = powerGroup.getLastWakeTimeLocked()) {                    groupNextTimeout = lastUserActivityTimeNoChangeLights + screenOffTimeout;                    if (now = 0) {                        final long anyUserActivity = Math.max(lastUserActivityTime,                                lastUserActivityTimeNoChangeLights);                        if (anyUserActivity >= powerGroup.getLastWakeTimeLocked()) {                            groupNextTimeout = anyUserActivity + sleepTimeout;                            if (now  0) {            nextTimeout = Math.min(nextTimeout, nextProfileTimeout);        }        if (hasUserActivitySummary && nextTimeout >= 0) {            scheduleUserInactivityTimeout(nextTimeout);        }    }    private void scheduleUserInactivityTimeout(long timeMs) {        final Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT);        msg.setAsynchronous(true);        mHandler.sendMessageAtTime(msg, timeMs);    }

          3、永不休眠

            1. 在 PowerManagerService 和 PhoneWindowManager 处理
            1. 直接配置 Settings.System.SCREEN_OFF_TIMEOUT 为Integer.MAX_VALUE( 2147483647 = 24.855 天 一般没有这么长时间亮屏待机 ),设置更长时间替换 Settings.System.SCREEN_OFF_TIMEOUT属性 VALIDATORS.put(System.SCREEN_OFF_TIMEOUT, NON_NEGATIVE_INTEGER_VALIDATOR) 中NON_NEGATIVE_INTEGER_VALIDATOR检测为NONE_NEGATIVE_LONG_VALIDATOR

            * 关键日志

            SettingsActivity:|SubSettings: Launching fragment|start u|ScreenTimeout:|sysui_multi_action: \[757,1754|screen_toggled:|sysui_multi_action:.*screen_timeout|power_screen_state:|PowerManagerService: Waking up|PowerManagerService: Going to sleep

            sysui_multi_action: [757,1754,758,4,759,15000]

            sysui_multi_action: [757,1754,758,4,759,30000]

            sysui_multi_action: [757,1754,758,4,759,60000]

            sysui_multi_action: [757,1754,758,4,759,120000]

            sysui_multi_action: [757,1754,758,4,759,300000]

            sysui_multi_action: [757,1754,758,4,759,600000]

            sysui_multi_action: [757,1754,758,4,759,1800000]

            12-17 07:13:37.536   645   678 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.google.android.apps.nexuslauncher/.NexusLauncherActivity (has extras)} from uid 012-17 07:13:40.128   645  2427 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.settings/.Settings bnds=[581,351][858,771]} from uid 1014912-17 07:13:46.309   645  2510 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cmp=com.android.settings/.SubSettings (has extras)} from uid 100012-17 07:13:46.408  7976  7976 D SettingsActivity: Switching to fragment com.android.settings.DisplaySettings12-17 07:13:46.409  7976  7976 D SubSettings: Launching fragment com.android.settings.DisplaySettings12-17 07:13:48.942  7976  7976 I sysui_multi_action: [757,830,758,4,833,0,854,screen_timeout,1089,0]12-17 07:13:48.948   645  1716 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cmp=com.android.settings/.SubSettings (has extras)} from uid 100012-17 07:13:49.036  7976  7976 D SettingsActivity: Switching to fragment com.android.settings.display.ScreenTimeoutSettings12-17 07:13:49.037  7976  7976 D SubSettings: Launching fragment com.android.settings.display.ScreenTimeoutSettings12-17 07:13:50.690  7976  7976 I sysui_multi_action: [757,1754,758,4,759,15000]12-17 07:13:52.884  7976  7976 I sysui_multi_action: [757,1754,758,4,759,30000]12-17 07:13:54.152  7976  7976 I sysui_multi_action: [757,1754,758,4,759,60000]12-17 07:13:55.559  7976  7976 I sysui_multi_action: [757,1754,758,4,759,120000]12-17 07:13:57.041  7976  7976 I sysui_multi_action: [757,1754,758,4,759,300000]12-17 07:13:58.400  7976  7976 I sysui_multi_action: [757,1754,758,4,759,600000]12-17 07:13:59.653  7976  7976 I sysui_multi_action: [757,1754,758,4,759,1800000]12-17 07:14:01.446  7976  7976 I sysui_multi_action: [757,1754,758,4,759,15000]12-17 07:14:16.400   645   708 I PowerManagerService: Going to sleep due to timeout (uid 1000)...12-17 07:14:17.032   645   645 I power_screen_state: [0,3,0,0,628]12-17 07:14:17.032   645   645 I screen_toggled: 012-17 07:14:17.032   645   645 I sysui_multi_action: [757,804,799,screen_timeout,801,15,802,1]12-17 07:14:28.765   645   793 I PowerManagerService: Waking up from Asleep (uid=1000, reason=WAKE_REASON_POWER_BUTTON, details=android.policy:POWER)...12-17 07:14:28.770   645   645 I screen_toggled: 112-17 07:14:28.905   645   645 I power_screen_state: [1,0,0,0,110]

上一篇:怎么进入设计公司?

下一篇:kafka tool下载安装和使用