티스토리 뷰

Development

[Android] PowerManager 의 이용

devbible 2010. 8. 27. 11:41

  Device의 Power state를 제어할 수 있게 해준다. Device 베터리 사용시간은 이 API의 사용에 따라 영향을 받게 된다. 따라서 반드시 필요한 경우가 아니라면 Wakelock을 acquire하지 않는 것이 좋다. 가능한 낮은 레벨을 사용하고 사용후에는 바로 release하는 것이 좋다.

PowerManager pm = (PowerManager)Context.getSystemServier(Context.POWER_SERVICE);

  아주 기초적인 API인 newWakeLock()를 사용할 것이다.
  이 API는 PowerManager.WakeLock객체를 만든다.
  device의 powerstate를 제어하기 위해 이 객체의 method를 사용하게 된다.

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
wl.acquire();
// ..screen will stay on during this section..
wl.release();


  System 전원에 영향을 미치는 flag가 아래와 같이 정의되어 있다.
PARTIAL_WAKE_LOCK : CPU(On*), Screen(OFF), Keyboard(OFF)
SCREEN_DIM_WAKE_LOCK : CPU(On), Screen(Dim), Keyboard(OFF)
SCREEN_BRIGHT_WAKE_LOCK : CPU(On), Screen(Bright), Keyboard(OFF)
FULL_WAKE_LOCK : CPU(On), Screen(Bright), Keyboard(Bright)

cf) PARTIAL_WAKE_LOCK를 유지하는 동안 CPU는 계속 run상태로 된다. 어떤 타이머나 사용자가 power button을 누르더라도 상태는 유지가 된다. 나머지 wakelock은 CPU가 run상태가 되지만 사용자가 power button을 눌러서 sleep으로 갈 수 있다.

  Screen에만 적용되는 2가지 flag가 더 있다. 이 플래그는 PARKTIAL_WAKE_LOCK에는 영향을 안준다.
1. ACQUIRE_CAUSES_WAKEUP
Normal wake locks don't actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. from user activity). This flag will force the screen and/or keyboard to turn on immediately, when the WakeLock is acquired. A typical use would be for notifications which are important for the user to see immediately

2. ON_AFTER_RELEASE
if this flag is set, the user activity timer will be reset when the WakeLock is released, causing the illumination to remain on a bit longer. This can be used to redece flicker if you are cycling between wake lock conditions.


PowerManager는 Screen을 On/Off할때 WindowManager에 통지를 하고 이는 KeyguardViewMediator를 통해 LockScreen에도 전달된다.
PowerManagerService.mNotificationTask
  -> WindowManagerPolicy.screenTurnedOn()
      -> KeyguardViewMediator.onScreenTurnedOn();
  -> WindowManagerPolicy.screenTurnedOff()
      -> KeyguardViewMediator.onScreenTurnedOff();



[출처] http://pheadra.tistory.com
[작성자] 파이드라

댓글