ow to add hibernate function for android system

1. How to add hibernate function for android system:



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 action


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, 

   
    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;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值