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);