본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] PowerManager 를 통해 안드로이드의 진정한 주인이 되어 봅시다.

by 돼지왕 왕돼지 2012. 1. 25.
반응형

 [Android/안드로이드] PowerManager 를 통해 안드로이드의 진정한 주인이 되어 봅시다.



PowerManager / 파워 매니져 / System Service / WakeLock / PowerManager.WakeLock /    Device / 단말 / 전원 / Power / 제어 / control / 배터리 사용 시간 / API / acquire /    release / 배터리 조루 / POWER_SERVICE  / getSystemService / newWakeLock / power flag / PARTIAL_WAKE_LOCK / SCREEN_DIM_WAKE_LOCK / SCREEN_BRIGHT_WAKE_LOCK / FULL_WAKE_LOCK / CPU / Screen / Keyboard / ACQUIRE_CAUSES_WAKE_UP / ON_AFTER_RELEASE / 깜박거림 / Notification / flicker / 수신 전화 / 알람 / permission / uses-permission / android.permission.WAKE_LOCK / Manifest / 매니페스트 / 권한 / goToSleep / isScreenOn / reboot / userActivity / isHeld / setReferenceCounted / setWorkSource / toString / Tutorial / 기초 강좌 / Android / 안드로이드 / 배터리 절약 정책 / 네비게이션 / Navigation / DMB / 동영상 플레이어 / 백그라운드 작업 / Background Process / LockScreen / 락스크린 / WifiLock / WifiManager



1. Information


먼저 Developer 의 내용을 간단히 정리해주세요


- PowerManager 는 Device 의 전원 상태 ( Power state ) 를 제어할 수 있게 도와줍니다.

- 단말의 배터리 사용시간은 PowerManager 의 API 사용에 따라 현저한 차이를 나타냅니다.

- 반드시 필요한 경우가 아니라면 WakeLocks 을 acquire 하지 않는 것이 좋습니다.

- 가능한 낮은 레벨을 사용하고 사용 후에는 반드시 release 하는 것이 좋습니다.


Developer 에서 class 에 대한 소개보다도 주의사항을 더 많이 표시하고 있습니다.
이 말은, 잘만 사용하면 원하는 효과를 볼 수 있지만, 잘못 사용하면 소위 말하는 배터리 조루를 초래할 수 있다는 이야기지요.
사용할 때 주의하셔야 겠습니다.



언제 사용하나요?


 안드로이드 시스템은 사용자의 Interaction이 없을 때 화면이나 키보드 조명을 차단하고, Sleep 후 일정 시간이 지나면  WiFi 네트워크도 끊어버리며, CPU 까지도 잠재워버리는 배터리 절약 정책을 가지고 있습니다.
대부분의 앱이 이 System 의 배터리 절약 정책을 따르고 있지만, 이 정책에 협조하지 않아야 하는 App 들도 존재합니다.
먼저 동영상 플레이어가 그 예인데, 배터리가 적다고, 그리고 화면을 터치하지 않는다고 화면을 끄면 안 되겠죠?
마찬가지로 네비게이션이나 DMB 도 User Interaction 이 없다고 화면을 끄면 안되죠. 
백그라운드 작업을 하는 앱들은 화면이 꺼지더라도 CPU는 계속 동작해야 합니다. 

이러한, 예외적인 경우에는 안드로이드 자체의 배터리 절약 정책을 따를 수 없다고, 공식적으로 표명하고 따르지 않는 방법이 있는데,
그것을 도와주는 것이 PowerManager 와 PowerManager.WakeLock 입니다.





어떻게 사용하나요?


 먼저 PowerManagerSystem Service로서 다음과 같이 얻어올 수 있습니다.

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


 가장 많이 사용하는 API 는 newWakeLock() 이고 return 값은 PowerManager.WakeLock object 이죠.
이 WakeLock 이라는 object 를 이용하여 power control 을 할 수 있는 것입니다.

PowerManager.WakeLock wakeLock = pm.newWakeLock( PowerManager.SCREEN_DIM_WAKE_LOCK, "MY TAG" );
wakeLock.acquire();
  // do something. 
  // the screen will stay on during this section.
wakeLock.release();


 Developer 에 명시되어 있듯이, 구현시에 꼭 필요한 경우가 아니라면 acquire() 하지 않는 것이 좋으며,
사용해야만 할 경우에는 반드시 사용이 끝나자마자 release() 를 해주어야 합니다.
또한 자신이 원하는 구현에서 꼭 필요한 내용만을 담고 있는 "가장 낮은 레벨" 을 사용해야 베터리를 아낄 수 있죠.



레벨 레벨 하시는데, 무슨 레벨들이 있나요?


 Flag Value CPU  Screen  Keyboard 
 PARTIAL_WAKE_LOCK  On   Off   Off 
 SCREEN_DIM_WAKE_LOCK  On   Dim   Off 
 SCREEN_BRIGHT_WAKE_LOCK  On   Bright   Off 
 FULL_WAKE_LOCK  On   Bright   Bright

Flag 들이 영향을 미치는 녀석들은 CPU, Screen, Keyboard (조명) 입니다.

위에 제시된 4개의 Flag 는 "|" 로 중첩하여 사용할 수 없습니다.

PARTIAL_WAKE_LOCK 의 경우 User 가 Power Button 을 눌러 단말을 sleep 시켜도 계속 CPU 가 돌게 되어 있습니다.
다른 녀석들은 Power Button 을 눌러 단말을 sleep 시키면 CPU 가 멈춥니다.
따라서 PARTIAL_WAKE_LOCK 을 acquire() 했을 때는 release() 가 더더더욱 더 중요하게 됩니다.


PARTIAL_WAKE_LOCK 을 제외한 나머지 3개의 Flag 에 대해서는 다음의 Flag를 "|" 로 더하여 사용할 수 있습니다.

 Flag Value  Description 
 ACQUIRE_CAUSES_WAKE_UP  보통의 WAKE_LOCK 은 켜진 화면을 계속 유지하게는 하지만, 꺼진 화면을 강제로 켜지는 않습니다. 하지만 이 Flag 가 함께 사용된다면, WakeLock이 acquire() 되는 순간 Screen 과 Keyboard 가 바로 켜집니다. 보통 긴급한 notification (착신전화, 알람) 등이 있을 때 주로 사용됩니다.
 ON_AFTER_RELEASE  이 Flag 가 설정되면 WakeLock 이 release 된 후 화면 timer를 reset 합니다. 이 때 화면이 꺼지는 시간이 조금 더 길어지기 때문에, WAKE_LOCK 조건을 여러 번 사용할 때 너무 빨리 꺼지지 않게 하여, 화면 깜빡임을 덜어줍니다.






가장 중요한 뭔가를 놓친 기분이에요..


 네. 정확하게 짚어내셨습니다.

이 PowerManager 의 WakeLock 을 사용하기 위해서는

Manifest에 <uses-permission> 을 이용해 android.permission.WAKE_LOCK 의 permission을 부여해야 합니다.

<uses-permission android:name="android.permission.WAKE_LOCK"/>


이게 설정되어 있지 않으면, 다 말짱 꽝입니다.



다른 API 들은 없나요?


 왜 없겠습니까? 다음과 같은 API 들을 제공합니다.
이름만 봐도 무슨 기능인지 아시겠죠? 자세한 것은 developer 를 참조하세요.

<PowerManager>

void goToSleep( long time )
boolean isScreenOn()
PowerManager.WakeLock newWakeLock( int flags, String tag )
void reboot( String reason )
void userActivity( long when, boolean noChangeLights )


[goToSleep() 을 사용하기 위해서는..]



<PowerManager.WakeLock>

void acquire()
void acquire( long timeout )
boolean isHeld()
void release()
void setReferenceCounted( boolean value )
void setWorkSource( WorkSource ws )
String toString()

 



2. Summary


- PowerManager 는 Device 의 전원 상태를 제어할 수 있도록 도와주는 system service class 이다.

- PowerManager 는 배터리 사용시간을 좌지우지하는 녀석으로 주의해서 사용해야 한다. 반드시

- 필요한 경우가 아니라면 WakeLock 을 acquire 하지 않는 것이 좋으며, acquire 를 했으면, 사용이 끝나자마자 바로 release 해주어야 한다.

- newWakeLock() 의 flag 로 사용할 수 있는 녀석은 총 4가지가 있으며 PARTIAL_WAKE_LOCK 을 제외한 3가지 경우는 2가지 flag 를 추가로 | 로 중첩시킬 수 있다.

- PowerManager 의 WakeLock 을 사용하기 위해서는 android.permission.WAKE_LOCK 을 permission 으로 주어야 한다.




3. References


- http://developer.android.com/reference/android/os/PowerManager.html 
   Android Developer Doc. PowerManager

http://developer.android.com/reference/android/os/PowerManager.WakeLock.html 
   Android Developer Doc. PowerManager.WakeLock

http://developer.android.com/reference/android/net/wifi/WifiManager.html 
   Android Developer Doc. WifiManager

http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html 
   Android Developer Doc. WifiManager.WifiLock







반응형

댓글17