Android 休眠(二)真.永久不休眠
adb shell settings get system screen_off_timeout
一.SettingsProvider def_screen_off_timeout
1.1.frameworks\base\packages\SettingsProvider\res\values\defaults.xml
欸为什么是0x7fffffff 换算 十进制 是2147483647
ro.rk.screenoff_time 也是2147483647
沙雕 整形最大取值就是 2147483647 换算成天数也就是24.85
true 0x7fffffff -1
1.2.frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java
//add for factory as ro.rk.screenoff_time loadSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT, SystemProperties.getInt("ro.rk.screenoff_time", mContext.getResources().getInteger(R.integer.def_screen_off_timeout)));
1.3.frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
a.观察 数据库 变化
class SettingsObserver extends ContentObserver { SettingsObserver(Handler handler) { super(handler); } void observe() { // Observe all users' changes …………………………………………………………………………………… resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.SCREEN_OFF_TIMEOUT), false, this, UserHandle.USER_ALL);
b.updateSettings mLockScreenTimeout
public void updateSettings() { ContentResolver resolver = mContext.getContentResolver(); boolean updateRotation = false; synchronized (mLock) { ……………………………………………………………… // use screen off timeout setting as the timeout for the lockscreen mLockScreenTimeout = Settings.System.getIntForUser(resolver, Settings.System.SCREEN_OFF_TIMEOUT, 0, UserHandle.USER_CURRENT);
c.postDelayed
private void updateLockScreenTimeout() { synchronized (mScreenLockTimeout) { boolean enable = (mAllowLockscreenWhenOn && mAwake && mKeyguardDelegate != null && mKeyguardDelegate.isSecure(mCurrentUserId)); if (mLockScreenTimerActive != enable) { if (enable) { if (localLOGV) Log.v(TAG, "setting lockscreen timer"); mHandler.removeCallbacks(mScreenLockTimeout); // remove any pending requests mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout); } else { if (localLOGV) Log.v(TAG, "clearing lockscreen timer"); mHandler.removeCallbacks(mScreenLockTimeout); } mLockScreenTimerActive = enable; } } }
1.4.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);
private int getScreenOffTimeoutLocked(int sleepTimeout) { int timeout = mScreenOffTimeoutSetting; if (isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()) { timeout = Math.min(timeout, mMaximumScreenOffTimeoutFromDeviceAdmin); } if (mUserActivityTimeoutOverrideFromWindowManager >= 0) { timeout = (int)Math.min(timeout, mUserActivityTimeoutOverrideFromWindowManager); } if (sleepTimeout >= 0) { timeout = Math.min(timeout, sleepTimeout); } return Math.max(timeout, mMinimumScreenOffTimeoutConfig); }
//根据nextTimeOut延迟发送信息,信息被处理后,将重新调用updatePowerStateLocked,于是再次进入到该方法
//通过不断进入该方法,不断评估是否根据用户动作亮、熄屏等
private void updateUserActivitySummaryLocked(long now, int dirty) { …………………………………………………… if (mUserActivitySummary != 0 && nextTimeout >= 0) { Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT); msg.setAsynchronous(true); mHandler.sendMessageAtTime(msg, nextTimeout); } } else { mUserActivitySummary = 0; }
二.补丁
diff --git a/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java b/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java index 62e960f..ab119c6 100755 --- a/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -7498,7 +7498,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (enable) { if (localLOGV) Log.v(TAG, "setting lockscreen timer"); mHandler.removeCallbacks(mScreenLockTimeout); // remove any pending requests - mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout); + if(mLockScreenTimeout != 0){ + mHandler.postDelayed(mScreenLockTimeout, mLockScreenTimeout); + } } else { if (localLOGV) Log.v(TAG, "clearing lockscreen timer"); mHandler.removeCallbacks(mScreenLockTimeout); diff --git a/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java b/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java index d38a942..ae64eed 100755 --- a/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java +++ b/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java @@ -1814,8 +1814,13 @@ public final class PowerManagerService extends SystemService mUserActivitySummary = USER_ACTIVITY_SCREEN_DREAM; nextTimeout = -1; } - - if (mUserActivitySummary != 0 && nextTimeout >= 0) { + Slog.d("gatsby","PowerManagerService mUserActivitySummary ->"+mUserActivitySummary); + Slog.d("gatsby","PowerManagerService nextTimeout ->"+nextTimeout); + + if(mScreenOffTimeoutSetting != 0){ + + if (mUserActivitySummary != 0 && nextTimeout >= 0) { + Slog.d("gatsby","PowerManagerService screenOff "); Message msg = mHandler.obtainMessage(MSG_USER_ACTIVITY_TIMEOUT); msg.setAsynchronous(true); mHandler.sendMessageAtTime(msg, nextTimeout); @@ -1823,6 +1828,10 @@ public final class PowerManagerService extends SystemService } else { mUserActivitySummary = 0; } + + }else { + mUserActivitySummary |= USER_ACTIVITY_SCREEN_BRIGHT; + } if (DEBUG_SPEW) { Slog.d(TAG, "updateUserActivitySummaryLocked: mWakefulness=" diff --git a/packages/apps/Settings/src/com/android/settings/DisplaySettings.java b/packages/apps/Settings/src/com/android/settings/DisplaySettings.java index 2b52b39..a55bcc1 100755 --- a/packages/apps/Settings/src/com/android/settings/DisplaySettings.java +++ b/packages/apps/Settings/src/com/android/settings/DisplaySettings.java @@ -473,7 +473,8 @@ public class DisplaySettings extends SettingsPreferenceFragment implements try { int value = Integer.parseInt((String) objValue); if (value == 0) { - value = Integer.MAX_VALUE; + //value = Integer.MAX_VALUE; + value = 0; } Settings.System.putInt(getContentResolver(), SCREEN_OFF_TIMEOUT, value); updateTimeoutPreferenceDescription(value);