powermanger API分析

http://blog.chinaunix.net/uid-13995546-id-2850215.html


1) power management api :

   WakeLock:  用两个函数来来操作
              acquire release , 最终这两个函数将调用 power management 的service .

   userActivity: 这个函数让设备回到full on 的状态
   

public void goToSleep(long time)

强制设备进入sleep状态!


public void setBacklightBrightness(int brightness)

设置屏幕的亮度

public int getSupportedWakeLockFlags()


public boolean isScreenOn()


public void reboot(String reason)



2) power management service  的启动
   在systemserver.java run 函数中调用

power = new PowerManagerService();


ServiceManager.addService(Context.POWER_SERVICE, power);


// only initialize the power service after we have started the

            // lights service, content providers and the battery service.

            power.init(context, lights, ActivityManagerService.getDefault(), battery);


powermanagementservice init:

1) 创建PowerManagerService.mScreenOffThread , 其中在handler 中将要创建looper
   

    a) BrightnessState 的创建

private final BrightnessState mScreenBrightness
            = new BrightnessState(SCREEN_BRIGHT_BIT);

       目前设置的mask 为SCREEN_BRIGHT_BIT

    b) 通过调用 BrightnessState 的run 函数, 然后调用
    -->         boolean stepLocked() 这个函数没1000/60 毫秒调用一次,并设置相应的亮度。
                 如果亮度是screen off, 也就是0, 将调用finishAnimationLocked
        关闭 button keypad 的led.


   b) setTargetLocked 
      这个函数将去除以前的动画, 并开始新的亮度设置的动画。



systemReady 当系统service 都设置好后,调用powermanager service systemReady




系统按键的处理:
  1. void NativeInputManager::interceptKeyBeforeQueueing(nsecs_t when,
  2.         int32_t deviceId, int32_t action, int32_t &flags,
  3.         int32_t keyCode, int32_t scanCode, uint32_t& policyFlags) {
  4. #if DEBUG_INPUT_DISPATCHER_POLICY
  5.     LOGD("interceptKeyBeforeQueueing - when=%lld, deviceId=%d, action=%d, flags=%d, "
  6.             "keyCode=%d, scanCode=%d, policyFlags=0x%x",
  7.             when, deviceId, action, flags, keyCode, scanCode, policyFlags);
  8. #endif

  9.     if ((policyFlags & POLICY_FLAG_VIRTUAL) || (flags & AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY)) {
  10.         policyFlags |= POLICY_FLAG_VIRTUAL;
  11.         flags |= AKEY_EVENT_FLAG_VIRTUAL_HARD_KEY;
  12.     }

  13.     // Policy:
  14.     // - Ignore untrusted events and pass them along.
  15.     // - Ask the window manager what to do with normal events and trusted injected events.
  16.     // - For normal events wake and brighten the screen if currently off or dim.
  17.     if ((policyFlags & POLICY_FLAG_TRUSTED)) {
  18.         const int32_t WM_ACTION_PASS_TO_USER = 1;
  19.         const int32_t WM_ACTION_POKE_USER_ACTIVITY = 2;
  20.         const int32_t WM_ACTION_GO_TO_SLEEP = 4;

  21.         bool isScreenOn = this->isScreenOn();
  22.         bool isScreenBright = this->isScreenBright();

  23.         JNIEnv* env = jniEnv();
  24.         jint wmActions = env->CallIntMethod(mCallbacksObj,
  25.                 gCallbacksClassInfo.interceptKeyBeforeQueueing,
  26.                 when, action, flags, keyCode, scanCode, policyFlags, isScreenOn);
  27.         if (checkAndClearExceptionFromCallback(env, "interceptKeyBeforeQueueing")) {
  28.             wmActions = 0;
  29.         }

  30.         if (!(flags & POLICY_FLAG_INJECTED)) {
  31.             if (!isScreenOn) {
  32.                 policyFlags |= POLICY_FLAG_WOKE_HERE;
  33.                 flags |= AKEY_EVENT_FLAG_WOKE_HERE;
  34.             }

  35.             if (!isScreenBright) {
  36.                 policyFlags |= POLICY_FLAG_BRIGHT_HERE;
  37.             }
  38.         }

  39.         if (wmActions & WM_ACTION_GO_TO_SLEEP) {
  40.             android_server_PowerManagerService_goToSleep(when);
  41.         }

  42.         if (wmActions & WM_ACTION_POKE_USER_ACTIVITY) {
  43.             android_server_PowerManagerService_userActivity(when, POWER_MANAGER_BUTTON_EVENT);
  44.         }

  45.         if (wmActions & WM_ACTION_PASS_TO_USER) {
  46.             policyFlags |= POLICY_FLAG_PASS_TO_USER;
  47.         }
  48.     } else {
  49.         policyFlags |= POLICY_FLAG_PASS_TO_USER;
  50.     }
  51. }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值