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

相关