본문 바로가기
Lecture/Android

안드로이드 화면 깨우기

by 알 수 없는 사용자 2012. 7. 27.
반응형


-------------------------------------------------------------------------------------------------------------------


외부 신호로부터 화면을 깨우기를 바라는 사람들을 위해 이렇게 글을씁니다 ㅇㅅㅇ;


안드로이드를 하면서 화면이 깨어나는 시간은 화면이 잠금모드로 들어갔을때입니다. 보통 안드로이드를 갖고 놀경우에는 화면이 깨어나있으니깐여;;

그럼 화면이 깨어나는 절차를 좀더 세분화 하여 알아보겠습니다. 

일단은 액티비티에서 알아보겠습니다.

1. 엑티비티에서 onPause 되었을때 화면이 깨도록 지정하고 전원버튼을 눌렀을때

2. 엑티비티에서 스레드를 생성하여 대충 1분뒤에 화면이 깨도록 지정하고 전원버튼을 눌렀을때

보통의 액티비티는 사용자와의 소통을 위해서 존재하는 태스크인데요, 여기서 화면을 깨우고 눕히고 하는행위는 녹음기처럼 장시간 반응은 없지만 죽지않아야하는 앱의 경우에 해당됩니다.


다음은 서비스부분에서 알아보겠습니다.

1. 알람신호에 의해 화면이 깨도록 지정했을때

2. gcm이나 pusher와 같이 receive 되었을때

서비스는 화면이 닫힌 상태에서도 돌기때문에 이러한 케이스에 화면을 깨우는것이 액티비티보다 좀더 이상적이라고 생각됩니다.


화면을 깨우려면 일단 퍼미션이 필요합니다.

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

추가해주시구요, 그다음엔 화면을 깨우는 방법인데 보통은 PowerManager 하나만으로 구성하려하지만 제가 수없이 디버깅해본결과 저것만으론 불가능합니다 ㅠㅠ;

일단은 이 클래스를 받아서 패키지에 삽입해줍니다.

AlarmWakeLock.java


이 클래스는 Context만 넘겨주면 알아서 화면을 깨우는 역할을 합니다. 깨우는 플래그는 FULL_WAKE_LOCK 와 몇가지 짬뽕했지만  원하는 플래그로 설정하셔도 상관없습니다. 하지만

 PowerManager.ACQUIRE_CAUSES_WAKEUP |    PowerManager.ON_AFTER_RELEASE 

이 두개만은 남겨두셔야합니다.


■ 설정 가능한 PowerManager 플래그들


이제 화면을 깨워볼차례인데요, 

위 클래스에서 wakeLock 함수와 releaseWakeLock 함수를 사용하여 화면을 깨우면 되는데 그전에 이 코드를 먼저 삽입해주셔야합니다.

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED

           | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD

           | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON

           | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

물론 서비스코드에서 저 함수를 실행하면 100% 오류가 납니다. 왜냐면 getWindow()메소드는 activity내부에 포함된 함수이기때문인데, 서비스는 activity를 갖고있지 않기 때문입니다. 그래서 activity 내부에 정적 엑티비티 변수를 하나 생성해놓고 사용하면 되는데요,

예를 들어

public class ContentActivity extends MapActivity {

public Context mContext = null;

public static Activity mActivity = null;


@Override

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        

        mContext = this;

       mActivity = this;

.

..

...

..

.

이렇게 액티비티내에 정적 필드를 만들고 onCreate하는순간 this를 삽입해버립니다. 이러면 어디서나 액티비티를 가져다 쓸 수 있는겁니다. 그렇지만 이렇게 해도 오류가 납니다. 왜냐면 서비스하는곳에서는 뷰를 핸들할 수 없기때문에 따로 핸들러를 작성해주셔야하는데요..;

그래서 다시한번 예를들자면 푸쉬가 날라오는순간이건 어떤 이벤트에 의해 receive가 날라오는 순간이건간에 아래 코드를 보시면

protected void onMessage(Context context, Intent intent) {

if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {

//화면깨우기

Thread wakeUpDisplay = new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

wakeUpHandler.sendEmptyMessage(0);

}

});

wakeUpDisplay.start();

NotiOrShowQuietTime.newInstance().notiOrShowQuietTime(this,qtNotifiIntent);

}

}


Handler wakeUpHandler = new Handler(){

public void handleMessage(Message msg) {

ContentActivity.mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED

           | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD

           | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON

           | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

AlarmWakeLock.wakeLock(ContentActivity.mActivity);

AlarmWakeLock.releaseWakeLock();

};

};

이렇게 스레드와 핸들러로 처리하면 손쉽게 화면을 깨울 수 있습니다.