1. How to add hibernate function for android system:
Plan:
(1) study suspend
(2) hibernate
1. a timer to control power state, running some seconds after the last event, time will set powerstate to SCREENOFF. and stops the timer.
2. a event can be from USER, KEY, TOUCH,
(2) hibernate process
After study the PowerManagerService.gotoSleep() , I write a PowerManagerService.hibernate() function.
Power management strategy is managed by PowerManagerService, such as turn off/on key light, turn on/off LCD backlight, put some some device (such as sourdcard) to sleep or wakeup, shutdown while bettery is low, reboot system.
By default , android don't support hibernate to disk. So I tried to add a hibernate function for android.
But from now on, this is not a perfect power management function, since it may don't put some device into sleep such as (sensors, network adapter)
Plan:
(1) study suspend
(2) hibernate
==========================
(1) study suspend
what affect PM action1. a timer to control power state, running some seconds after the last event, time will set powerstate to SCREENOFF. and stops the timer.
2. a event can be from USER, KEY, TOUCH,
public void goToSleep(long time)
{
goToSleepWithReason(time, WindowManagerPolicy.OFF_BECAUSE_OF_USER);
}
private void setPowerState(int state)
{
setPowerState(state, false, WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT);
}
private void setPowerState(int newState, boolean noChangeLights, int reason)
{
synchronized (mLocks) {
int err;
if (mSpew) {
Slog.d(TAG, "setPowerState: mPowerState=0x" + Integer.toHexString(mPowerState)
+ " newState=0x" + Integer.toHexString(newState)
+ " noChangeLights=" + noChangeLights
+ " reason=" + reason);
}
if (noChangeLights) {
newState = (newState & ~LIGHTS_MASK) | (mPowerState & LIGHTS_MASK);
}
if (mProximitySensorActive) {
// don't turn on the screen when the proximity sensor lock is held
newState = (newState & ~SCREEN_BRIGHT);
}
(2) hibernate process
After study the PowerManagerService.gotoSleep() , I write a PowerManagerService.hibernate() function.
public int hibernate() {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
if (mLastEventTime <= time) {
mLastEventTime = time;
// cancel all of the wake locks
mWakeLockState = SCREEN_OFF;
int N = mLocks.size();
int numCleared = 0;
for (int i=0; i<N; i++) {
WakeLock wl = mLocks.get(i);
if (isScreenLock(wl.flags)) {
mLocks.get(i).activated = false;
numCleared++;
}
}
Slog.d(TAG, "hibernate computer" + numCleared );
mUserState = SCREEN_OFF;
try {
int err = Power.hibernate();
//turn screen on
cancelTimerLocked();
// setPowerState(SCREEN_ON_BIT);
} catch (IOException e) {
Slog.w(TAG, "IOException", e);
}
return 0;