PowerManager 를 통해 안드로이드의 진정한 주인이 되어 봅시다.
URL : http://aroundck.tistory.com/48
1. Information
먼저 Developer 의 내용을 간단히 정리해주세요
- PowerManager 는 Device 의 전원 상태 ( Power state ) 를 제어할 수 있게 도와줍니다.
- 단말의 배터리 사용시간은 PowerManager 의 API 사용에 따라 현저한 차이를 나타냅니다.
- 반드시 필요한 경우가 아니라면 WakeLocks 을 acquire 하지 않는 것이 좋습니다.
- 가능한 낮은 레벨을 사용하고 사용 후에는 반드시 release 하는 것이 좋습니다.
.....
안드로이드 시스템은 사용자의 Interaction이 없을 때 화면이나 키보드 조명을 차단하고, Sleep 후 일정 시간이 지나면 WiFi 네트워크도 끊어버리며, CPU 까지도 잠재워버리는 배터리 절약 정책을 가지고 있습니다.
.....
예외적인 경우에는 안드로이드 자체의 배터리 절약 정책을 따를 수 없다고, 공식적으로 표명하고 따르지 않는 방법이 있는데,
그것을 도와주는 것이 PowerManager 와 PowerManager.WakeLock 입니다.
먼저 PowerManager 는 System 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() 를 해주어야 합니다.
또한 자신이 원하는 구현에서 꼭 필요한 내용만을 담고 있는 "가장 낮은 레벨" 을 사용해야 베터리를 아낄 수 있죠.
.....
참고 Android Developer : http://developer.android.com/reference/android/os/PowerManager.html
최근 심심풀이로 화면을 제어하는 앱을 간단히 만들었다가 Wake Lock을 써서도 해봤다.
특히 위젯에서도 써봤다.
고민좀 해보고 테스트를 해봤더니
acquire하고 release를 정확하게 안하면 베터리 소모가 늘어나게 되는데
정확하게 제어를 할 수 없는 위젯은 더더욱 위험하다고 판단이 되고
(위젯은 자체의 인스턴스나 레퍼런스를 시간이 지나면 상실한다고 보면 되기 때문)
Activity등 앱 상 화면에서 필요에 의해서 사용하는 것이 좋고
특정 화면에서 화면에서 화면이 꺼지지 않아야 한다면 차라리
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
플래그를 사용하는 것이 더 낫다고 본다.