정보공간_1

[6기 강남 송태현] Android PowerManager wakeLock 본문

IT 놀이터/Elite Member Tech & Talk

[6기 강남 송태현] Android PowerManager wakeLock

알 수 없는 사용자 2014. 11. 21. 20:46

안녕하세요 엘리트멤버 6기 23-2기 송태현 입니다.

저번시간엔 안드로이드 프레임워크 내부에 Power가 어떻게 관리되고 그것을 관리하는 클래스인 PowerManagement에 대해서 알아보았습니다.

이번시간에는 PowerManager에서 제공하고 API형태로 제공된 WakeLock에 대해서 알아보고 그것을 잘 사용하는 방법을 알아보겠습니다.

 

1. 우선 구글 develop에 문서에서 나온 PowerManager WakeLock에 대한 설명을 번역하면 다음과 같습니다.

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

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

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

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

 

2. 일반적으로 다음과 같은 상황에서 사용합니다.

안드로이드 시스템은 사용자의 Interaction이 없을 때 화면이나 키보드 조명을 차단하고, Sleep 후 일정 시간이 지나면  Wifi 또는 LET나 3G 네트워크도 끊어버리고, CPU까지 잠재워버리는 베터리 절약 정책을 가지고 있습니다.

대부분의 어플리케이션이 System의 베터리 절약 정책을 따르고 있지만, 이 정책을 따르지 않는 어플리케이션들도 있습니다.

대표적으로 동영상플레이가 이러한데, 동영상이 플레이중인데도 베터리가 적다고, 그리고 화면을 터치하지 않는다고 화면이 꺼지진 않습니다.

따라서 어떠한 이벤트들이 없더라도 앱이 실행중이면 계속 화면을 on해야 합니다. 또한

화면은 동작하지 않는데 서비스단에서 동작해야 하는 경우도 있습니다. 이럴경우 CPU는 계속 돌아가야합니다.

이러한 기능들을 도와주는것이 WakeLock입니다.

 

3. 사용법

PowerManager는 SystemService로서 다음과 같이 객체를 선언 합니다.

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

가장 많이 사용하는 API가 newWakeLock()이고, 리턴값은 PowerManager.WakeLock 객체형태 입니다.

이 WakeLock이라는 Object를 이용하여 안드로이드 Power를 제어할수 있습니다.

 

PowerManager.WakeLock wakeLock = pm.newWakeLock( PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG" );
wakeLock.acquire();

  // 락잠금했을때 여러분이 원하는 동작 코드

wakeLock.release();

 

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

 

4. 각각 레벨에는 다음과 같습니다.

Flag값에 변경되는것이 CPU, Screen, 키보드 입니다.

 

PARTIAL_WAKE_LOCK 의 경우 User 가 Power Button 을 눌러 단말을 sleep 시켜도 계속 CPU 가 돌게 되어 있습니다.
다른 녀석들은 Power Button 을 눌러 단말을 sleep 시키면 CPU 가 멈춥니다.
따라서 PARTIAL_WAKE_LOCK 을 acquire() 했을 때는 release() 가 더더더욱 더 중요하게 됩니다.
PARTIAL_WAKE_LOCK 을 제외한 나머지 3개의 Flag 에 대해서는 다음의 Flag를 "|" 로 더하여 사용할 수 있습니다.

 

5. 마지막으로 WakeLock을 사용하기 위해선 AndroidManifest에서

<uses-permission android:name="android.permission.WAKE_LOCK"/> 와 같은 퍼미션을 주어야 사용이 가능합니다.

 

마무리로 WakeLock을 잘 쓰면 자신이 구현한 어플에 베터리를 잘 아낄 수가 있습니다.

그러나 잘못사용하면 오히러 더 베터리를 소모 할 수도 있으니 사용할 곳에 디바이스에 어떠한 부분이 필요하고 화면이 꺼져도 되는지에 대한 연관을 잘 파악한 후 사용하는것이 좋습니다.

 

감사합니다.