관리 메뉴

드럼치는 프로그래머

[안드로이드] PowerManager, getWindow() 를 이용한 Screen On / Off 본문

★─Programing/☆─Android

[안드로이드] PowerManager, getWindow() 를 이용한 Screen On / Off

드럼치는한동이 2013. 5. 9. 14:37

[스크린 on / off 기능]


스크린 on / off 개발로 인해 시중에 있는 여러 코드를 확인해 보니 하나 같이 제대로 동작하지 않는 코드들이 많았다. 어쩔 수 없이 새롭게 구현을 하였기에 많은 사람들이 스크린 on / off 기능으로 조금이나마 짜증내 하지 않았으면 좋겠다.

 

1. 알아 두어야 할 PowerManager flag


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

 

일반적으로 PowerManager 는 위와 같은 flag 를 사용한다. CPU 를 유효상태로 만든다던가, 화면을 밝게 만든다던가 등의 옵션이 담겨져 있다.

또한, PowerManaer 를 이용하기 위해서는 다음과 같은 권한을AndroidManifest.xml 에 설정해주도록 한다.

 

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

 

Wake_Lock 권한이 있어야 비로소 PowerManager 를 이용할 수 있다.

그렇다면, 바로 PowerManager 를 사용하기 위한 코드.
다음과 같이 클래스를 만들어 준다.

 

public class AlarmWakeLock {

 

private static final String TAG = "AlarmWakeLock";

private static PowerManager.WakeLock mWakeLock;

 

public static void wakeLock(Context context) {

if(mWakeLock != null) {

return;

}


PowerManager powerManager =

(PowerManager)context.getSystemService(

Context.POWER_SERVICE);



mWakeLock = powerManager.newWakeLock(

PowerManager.FULL_WAKE_LOCK, TAG);

mWakeLock.acquire();

}

 

public static void releaseWakeLock() {

if(mWakeLock != null) {

mWakeLock.release();

mWakeLock = null;

}

}

}

 

사용하는 방법은 어디서든지 다음과 같이 메소드를 호출하면 된다.

 

Screen On : AlarmWakeLock.wakeLock(Context);


Screen Off : AlarmWakeLock.releaseWakeLock();

 

이제 어디서든 해당 클래스의 Static 메소드를 호출하면 이용할 있다. 하지만, 일반적인 인터넷에서는 방법이나 getWindow 이용하는 방법이 나와 있는데 PowerManager 만을 이용하면 화면은 꺼지는데, 화면이 켜지지 않는 문제가 발생하게 된다. 이러한 경우는 다음과 같이 PowerManager 함께 getWindow 방식을 이용하도록 하자.


[Activity.getWindow 메소드를 이용한 Screen On]

 

Screen On 실행할 Activity onCreate() 다음과 같이 코드를 추가해

주도록 한다.

 

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

getWindow().addFlags(

WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |

WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

…………………………………… 구현부

}

 

이렇게 PowerManager WindowManager Flag 값을 이용하면 Screen On / Off 있게 된다. 다만, 주의해야 점은 PowerManager releaseWakeLock() 메소드를 이용하고 싶다면, wakeLock() 메소드를 getWindow() 같이 호출 주어야 한다는 점이다. 이유는 해당 wakeLock() 메소드 내부에서 newWakeLock() 메소드를 이용하여 PowerManager 객체를 생성해주기 때문이다. 점을 이해한다면, 아무런 문제 없이 Screen On / Off 구현할 있으며 손쉽게 알람 개발에도 적용할 있을 것이다.

 

[출처] http://blog.naver.com/s145?Redirect=Log&logNo=140153041039

Comments