Android Wake Lock

2017. 3. 3. 21:29

Android Power Management

  • Android power menagemt에서는 다음과 같은 기능을 제공한다.
    • 스크린 on/off 기능
    • 스크린 back light 조절 기능
    • 키패드 back light 조절 기능
    • 버튼 활성화 기능
    • 스크린 밝기 조절 기능


WakeLock

  • 안드로이드 앱에서 사용자가 일정 시간 이상 특별한 조작을 하고 있지 않으면 화면이 꺼지고 그 이상이 되면 CPU의 동작이 멈추는 딥슬립(deep sleep) 상태가 된다. 
  • Deep sleep 상태에서는 BroadcastReceiver 클래스의 onReceive() 메서드가 다른 요소에 의해 깨어날 때까지 호출되지 않는다. 단, 이때 wake up 알람일 경우에는 onReceive()를 호출하고 처리가 완료될 때까지 sleep mode로 들어가지 않는다. 
  • 뿐만 아니라 사용자가 비디오를 보는 경우와 같이 이러한 동작을 명확히 막아야 하는 시나리오가 있는데, 이때 사용하는 것이 WakeLock이다. 
1
2
3
4
5
6
7
8
// Use WakeLock
private void runInWakeLock(Runnable runnable, int flags) {
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(flags, "My WakeLock");
    wl.acquire();
    runnable.run();
    wl.release();
}

  • Android WakeLock 플래그는 CPU, 화면, 키보드 중 어떤 장치를 사용할지 설정하는데 사용된다. 

플래그

CPU

화면

키보드

PARTIAL_WAKE_LOCK

실행

꺼진 상태

꺼진 상태

SCREEN_DIM_WAKE_LOCK

실행

어두운 화면

꺼진 상태

SCREEN_BRIGHT_WAKE_LOCK

실행

밝게 켜짐

꺼진 상태

FULL_WAKE_LOCK

실행

밝게 켜짐

밝게 켜짐

  • 그리고 위 플래그는 다음 두 가지 플래그와 조합하여 사용할 수 있다. 
    • ACQUIRE_CAUSES_WAKEUP
      크린과 키보드, 스크린 또는 키보드를 활성화시킨다
    • ON_AFTER_RELEASE
      WakeLock이 해제된 후 스크린이나 키보드를 활성화 상태로 조금 더 유지한다
  • 백그라운드 서비스 용도로는 주로 PARTIAL_WAKE_LOCK 플래그를 많이 사용한다. 
  • 리고 AndroidManifest에 WakeLock 사용을 위한 퍼미션을 선언하여야 한다.
1
<use-permission android:name="android.permission.WAKE_LOCK" />



WakeLock 사용 Tips

  • WakeLock은 호출 횟수와 점유 시간 모두 중요하며 호출 횟수가 적어도 점유 시간이 많다면 실제 배터리 사용량은 더 많다고 할 수 있다. 따라서 백그라운드 서비스에서는 호출 횟수도 적고 점유 시간도 적도록 WakeLock을 잘 사용해야 한다. (사실 이게 다다. 뾰족한 수가 있는 것은 아니다)
  • WakeLock을 효율적으로 사용하기 위한 실천 사항
    • WakeLock은 가능한 가장 낮은 레벨을 사용하고 원하는 동작을 수행했다면 곧바로 release() 메서드를 호출한다.
    • Exception 등으로 인해 release() 메서드가 호출되지 못하는 일이 없도록 finally 키워드를 사용한다.
    • 패킷 발신, 수신에 사용한다면 발신할 때 한 번, 수신할 때 다시 한 번 WakeLock을 호출하여 두 번의 호출이 생긴다. 만약 발신 후 수신까지 시간이 매우 짧다면 WakeLock.acquire(timeout) 메서드를 사용하여 호출 횟수를 줄일 수 있다. (acquire(timeout) 메서드가 ICS 이전 버전에는 심각한 오류가 있었다)
    • BroadcastReceiver 클래스를 사용하는 경우에 onReceive() 메서드 이후의 로직이 언제나 정상적으로 수행되게 하기 위해서 WakeLock을 사용할 수 있다. 이때 Android Support Library를 사용하면 WakefulBroadcastReceiver 클래스를 사용하여 직접 WakeLock을 호출하지 않아도 된다.
    • 스크린을 계속적으로 유지하는 것이 액티비티의 뷰와 관련 있다면 레이아웃 파일의 android:keepScreenOn XML 속성을 사용할 수도 있다. 이렇게 하면 WakeLock 효과를 얻는데 시스템이 알아서 처리한다. 게다가 추가적인 권한 설정도 필요 없다. 
1
2
3
4
5
6
7
8
<?xml version="1.0" endcoding="utf-8" ?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:keepScreenOn="true"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
...



Posted by 그레이트쪼
:

BLOG main image
What a Great World!!
개발자의 잡동사니 책상 by 그레이트쪼

공지사항

카테고리

분류 전체보기 (70)
자료구조와 알고리즘 (35)
Java & Android (16)
C & C++, 일반 (7)
디자인패턴 (7)
자유로운 이야기 (5)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total :
Today : Yesterday :