이것Do! 저것Do!!

문자가 수신 시 다시 화면을 켜는 동작은 PowerManager class와 PowerManager.WakeLock class를 통해 이루어진다. power와 관련된 system service를 얻어와서 wake lock을 이용해 제어를 하는 형식이다. 세세한 부분은 안드로이드 문서를 참조하기로 하고 일단 코드를 보자면...
  46:     PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
  47:     Log.d(LOGTAG, "Is screen on? " + pm.isScreenOn());
  48:     
  49:     if (!pm.isScreenOn()) {
  50:         Log.d(LOGTAG, "Acquire WakeLock!!");
  51:         ShowMeSmsWakeLock.acquireWakeLock(context);
  52:         
  53:         //Toast.makeText(context, strSms, Toast.LENGTH_LONG).show();
  54:         
  55:         try {
  56:             Thread.sleep(10000);
  57:         } catch (Exception e) {
  58:             Log.d(LOGTAG,"Exception occured~!");
  59:         }
  60:         
  61:         Log.d(LOGTAG, "Release WakeLock!!");
  62:         ShowMeSmsWakeLock.releaseWakeLock();                
  63:     } else {
  64:         Toast.makeText(context, strSms, Toast.LENGTH_LONG).show();
  65:     }
요런 부분이 SmsReceiver에 추가가 되었고, PowerManager와 관련된 구현은 따로 클래스를 만들어서 static method로 이용하도록 하였다. 그러니까...
   1: /**
   2:  * 
   3:  */
   4: package diy.myapps.android;
   5:  
   6: import android.content.Context;
   7: import android.os.PowerManager;
   8:  
   9: /**
  10:  * @author Chaotic21c
  11:  *
  12:  */
  13: public class ShowMeSmsWakeLock {
  14:  
  15:     private static PowerManager.WakeLock wakeLock;
  16:     
  17:     static void acquireWakeLock(Context context) {    
  18:         if (wakeLock != null) {
  19:             return;
  20:         }
  21:         
  22:         PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
  23:         wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | 
  24:                                 PowerManager.ACQUIRE_CAUSES_WAKEUP, "ShowMeSmsWakeLock");
  25:         wakeLock.acquire();
  26:     }
  27:     
  28:     static void releaseWakeLock() {
  29:         if (wakeLock != null) {
  30:             wakeLock.release();
  31:             wakeLock = null;
  32:         }
  33:     }
  34: }
뭐 이런 식이다.

몇 가지 덧붙이자면..
ShowMeSmsWakeLock class에서 newWakeLock을 할 때 코드에서처럼 parameter를 주고 실행을 시켜보면 분명히 켜지긴 한다. 근데 금방 도로 꺼져버린다. ㅡㅡ;; SmsReceiver에서 구현되어 있는 것처럼 acquireWakeLock()을 했다가 메시지를 Toast로 보여주고 다시 releaseWakeLock()을 하니까 당연히 그럴 수 밖에.... 저 위에서 Thread.sleep(10000)이 들어가 있는 이유가 이것 때문인거다.

근데 그 위의 Toast.makeText()는 왜 주석처리를 했을까??

처음에는 미처 생각을 못했었는데, 대부분의 스마트폰은 슬립모드에서 빠져나올 때 화면잠금(Screen Lock)기능을 사용하고 있다. 즉, 사용자가 정해진 액션을 취하고 난 뒤에야 홈 스크린으로 들어갈 수 있는 것이다. (아, 젠장...ㅡㅡ;;) 결국, 화면잠금을 SW적으로 해결을 하지 못하는 한 Toast고 Dialog고 할 것 없이 말짱 도루묵이라는 뜻......ㅠㅠ




그야말로 야심차게(?) 프로젝트를 시작했건만, 삼일천하도 아니고 1박2일도 아니고(ㅡㅡ;;) 당일치기(ㅡ,.ㅡ)가 되어 버렸다는 말씀...에효......

물론, 안드로이드 초보 개발자로서 얻은 것이 더 많다. (암, 긍정적으로 살아야지...크...... 아씨...그래도 너무 바보같아...ㅠㅠ) 하지만, 뭔가 프로젝트를 새로 하려고 할 때에는 구상하는 단계에서 limitation으로 작용할 부분을 미리 체크하여, 한창 진행을 하다가 슥슥 말아 잡숴버리는(응?) 이런 불미스러운 사태가 일어나지 않도록 각별한 주의를 기울여야 할 것이다.

사회생활 몇 년씩 하면 뭐하나...아직 이런 코딱지만한 프로젝트 기획도 제대로 못하는데......아직 갈 길이 멀다. ㅠㅠ
(그래도 좌절하지 않는다. 배우면 되지 뭐........ㅋㅋㅋㅋ 만쉐이~~)

아, 그래도 ShowMeSms는 현재 내 폰에서 잘 돌아가고 있다. AngryBird하는 중에 문자오면 게임 화면 위에서 바로 보여주니 편하긴 하구만 뭐..ㅋㅋㅋㅋ

아참..한 가지 더!!
이런 정도의 기능만 필요하다면 굳이 Activity를 가지고 있을 필요는 없다. 그래서, 다시 프로젝트를 생성하면서 "Create Activity"의 체크를 해제...
이러면 app launcher에는 표시가 되지 않는다. 당연히, Manifest에 MAIN과 LAUNCHER가 정의되어 있지 않으니까...

이상, 초허접 프로젝트 끝~~!! ^^*