이번에는,
어플리케이션이 실행중이지 않은 상태에서 바탕화면에 반투명 액티비티를 띄우는 방법을 알아보도록 하겠습니다.


단계는 3단계로 나누어 집니다.
 1. 매니페스트 설정
 2. 액티비티 설정
 3. 서비스, 또는 리시버에서 투명액티비티를 실행 



 1. AndroidManifest.xml 코드


매니페스트 파일에서 투명으로 생성할 액티비티의 속성에 위의 코드를 추가해주어야 합니다.
사실 완전한 투명은 아니고, 반투명의 상태로 액티비티를 띄우는 것입니다.(Translucent == 반투명한)

위 처럼 액티비티의 스타일에 반투명한 테마를 설정해주었다면, 매니페스트에서 할일은 끝났습니다.



 2. 액티비티(java파일) 설정

이 액티비티는 레이아웃 구성을 하지 않아도 되기때문에 레이아웃 xml 파일이 필요하지 않습니다.
즉, setContentView(R.layout.파일이름); 의 코드를 작성하지 않아도 됩니다.
대신 다른 설정을 해 주어야합니다.





액티비티에는 두가지의 플래그가  사용되었습니다.


FLAG_KEEP_SCREEN_ON
 :  Window flag: as long as this window is visible to the user, keep the device's screen turned on and bright.

FLAG_BLUR_BEHIND
 : Window flag: blur everything behind this window.


위의 KEEP_SCREEN_ON 플래그는 유저가 디바이스의 화면을 끄지 않는 한은 화면을 띄워 놓고 꺼지지 않게 유지시켜주는 역할을 합니다.
아래의 BLUR_BEHIND 플래그는 지금 생성되는 액티비티 뒤에 깔리게 되는 화면에 대해 초점을 잃게 만듭니다.
쉽게 생각해서 포토샵의 블러효과를 준다고 생각하면 됩니다.



 3. 리시버, 또는 서비스에서 액티비티 실행

이제 액티비티를 실행할 단계입니다.
(지금 하려는 것은 서비스, 리시버에서 이벤트 발생시 어플리케이션이 살아있지 않은 단계에서
투명액티비티를 띄워서 디바이스 사용자에게 뭔가 내가 원하는 메시지를 전달하고자 하기 위한것입니다.)


실제로 액티비티를 띄우는 방법은 위의 3줄로 가능합니다.

여기서 중요한 점은 Intent의 플래그입니다.
FLAG_ACTIVITY_NEW_TASK 플래그를 설정해주지 않는다면 에러가 날 수 있습니다.
(FALG_ACTIVITY_NEW_TASK 대한 관련 글 : [Android] Activity가 아닌곳에서 startActivity 사용)






저는 이 방법을 푸시메시지를 보낼때 사용합니다.
안드로이드 2.2부터는 푸시메시지 보내는 것이 가능해졌기 때문에 여러가지 방법으로 응용할 수 있습니다.
(안드로이드 푸시메시지 보내기 관련글 : [Android] Push - 안드로이드 푸쉬알림,  C2DM)


C2DM과 결합하여 결과적으로는 아래와 같이 사용할 수 있습니다.




Posted by croute

댓글을 달아 주세요

  1. Favicon of https://88oy.tistory.com BlogIcon 팔팔청춘 2011.05.31 22:09 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다^^

  2. 2011.07.02 20:52  댓글주소  수정/삭제  댓글쓰기

    우선 좋은 정보 감사합니다.

    제가 블로그글 보고 다이어로그를 띄웠는데요. 다이어로그 띄워서 비밀번호 치게 하는거라 비밀번호가 일치하지 않음 다시 같은 다이어로그를 띄우고싶거든요...그럴 경우엔 어떻게 해야하나요?

    • Favicon of https://croute.me BlogIcon croute 2011.07.04 14:34 신고  댓글주소  수정/삭제

      말씀하신 그대로 하시면 됩니다.

      다이얼로그 띄우고
      띄워서 비밀번호 치게하고
      비밀번호 일치하는지 확인한 다음 틀렸으면
      다시 같은 다이얼로그 띄우면 되지요.

      무엇을 물어보시는건지...?

  3. 우나 2011.07.20 16:48  댓글주소  수정/삭제  댓글쓰기

    도움 많이 됐습니다.
    근데 아이폰처럼 락화면에서
    띄우는 방법은 없나요.
    락해제하고 띄우는거까진 성공했는데
    해제하지않고 그냥 락화면에서
    텍스트만 표기한다던지 할수 있는 방법을 모르겠네요.
    락화면위젯을 따로 구성해야되는지 복잡하군요^^;

    • Favicon of https://croute.me BlogIcon croute 2011.07.20 17:47 신고  댓글주소  수정/삭제

      락화면에서
      어떤 텍스트를 어떻게 표현하고 싶으신건지..?

      텍스트만 표시하려고 해도 텍스트뷰가 필요하고
      뷰를 담을 윈도우가 필요하고
      윈도우를 구현할 액티비티가 필요한 법인데..

  4. 나나나 2011.10.27 20:47  댓글주소  수정/삭제  댓글쓰기

    콘텍스트는 먼가요??

    • Favicon of https://croute.me BlogIcon croute 2011.10.28 00:07 신고  댓글주소  수정/삭제

      안드로이드에서 컨텍스트는,
      애플리케이션 작동을 위한 기반환경이 되는 것입니다.

      예를들면, 애플리케이션의 기반 context가 있을 수 있고,
      Activity나 Service등도 context가 될 수 있습니다.

      http://goo.gl/gCyKj

  5. BlogIcon mgang 2013.05.13 15:30  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 블로그가 많은 도움이 됬습니다.
    질문이 있는데요.

    서비스나 리시버를 등록 하지 않은 상태에서.
    엑티비티를 띄울 수는 없나요?
    앱이 실행되고 있는 상태에서 홈키를 누르면 백그라운드로 넘어가고.
    그상태에서도 실행되고 있잖아요.

    이벤트가 들어오면 엑티비티를 띄우려고 하는데.
    진동같은 경우는 이벤트가 들어오면 실행이 되는데
    새로운 엑티비티를 불르는것은 안되더라구요.
    홈 대기 상테에서 안불러지고. 어플을 실행하면 그때서야 불러지더라구요

    • Favicon of https://croute.me BlogIcon croute 2013.05.13 16:10 신고  댓글주소  수정/삭제

      "이벤트가 들어오면" 이라는 조건을 말씀하셨는데,
      안드로이드에서 외부 유입(?) 이벤트는 BroadcastReceiver 로 받아서 처리합니다.
      결국에는 intent action 을 지정해주고, 리시버/서비스에서 처리를 해줘야 하는거지요.

      어떤 경우에, 어떤 이벤트를 리시버나 서비스 없이 받아서 처리하려고 하는 것인지 궁금합니다.

      일반적인 경우라면 리시버/서비스를 탈 수 밖에 없죠.

      가장 대표적인 외부 유입 이벤트인 GCM 또한 리시버를 타는거구요.