powermanger API分析

来源:互联网 发布:郑州用友软件总代理 编辑:程序博客网 时间:2024/06/06 10:57

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. }