정보공간_1

[2기 강남 권도일]Service와 Broadcast-Reciever를 이용한 나만의 LockScreen 만들기 본문

IT 놀이터/Elite Member Tech & Talk

[2기 강남 권도일]Service와 Broadcast-Reciever를 이용한 나만의 LockScreen 만들기

알 수 없는 사용자 2012. 9. 17. 16:06

안녕하세요 강남 소프트웨어 멤버십 21-1기 권도일입니다. 이번 주제를 무엇으로 할까 고민하다가 잡은 주제가 안드로이드쪽입니다. 개인적으로 한번 만들어 보고 싶기도 하였고 그래서 결국 만들게 된 OnLocker라는 made by Kwon Doil의 Lockscreen에 대한 소개 및 구현에 필요한 간단한 기술적 이슈를 짚고 넘어 가보고자 합니다. 기술적으로 큰 이슈는 없지만 Contents적인 요소가 강한 Application임으로 부담없이 재미있게 유쾌하게 읽어주시면 감사하겠습니다. 

그럼 시작해볼까요?

LockScreen이라는 것을 만들기 위해서 가장 기본적으로 필요한,그리고 이해하고 있어야 할 2가지를 먼저 짚고 넘어가겠습니다. 바로 BroadcastReceiver와 Service입니다.

BroadcastReceiver : 핸드폰에서 발생하는 특정 intent 신호를 받아주는 클래스

(본인이 개발한 Application에서는 전원이 On 되는 특정 intent 신호를 받아서 동작하도록 되어 있다.)

Service : 특정 Applicationbackground로 항시 돌아가도록 만들어 주는 클래스

정말 간단하죠? 그렇다면 이것이 어떤식으로 이용을 하는 것인지 간단한 그림으로 소개를 해보고자 합니다.


전체적인 구조도를 소개해 드릴 필요는 없을 것 같고 간단하게 여러분이 화면을 ON하였을 경우에 짠!하고  여러분이 만든 Lockscreen이 뜨는 방법에 대한 소개를 하도록 하겠습니다. 저의 목적은 이렇습니다.

화면이 ON되면 ON이라는 EVENT를 잡아내어 Background로 돌고 있는 무언가가 나의 Lockscreen을 뿅!하고 띄워주는 것입니다. 그림에서 보시면 아시겠지만 3개의 Activity 가 필요합니다.

전원이 ON되었음을 잡아 낼 수있는 Receiver 클래스(저는 MyReceiver라고 명명하였습니다.), 그리고 Background로 계속 돌고 있는 Service 클래스(MyService라고 명명하였습니다.)그리고 화면에 짠!하고 띄우고 싶은 LockScreenActivity 이렇게 3개의 class를 생성합니다. SCREEN_ON, SCREEN_OFF의 경우 xml상에서 등록할 수 없기때문에 암시적 등록이 아닌 명시적 등록을 해주어야 합니다.

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);

filter.addAction(Intent.ACTION_SCREEN_ON);

registerReceiver(new BroadcastReceiver() {....}.filter);

요로코롬 등록을 해주면 됩니다.


BroadcastReceiver 쪽의 소스입니다. 정말 간단하죠? extends로 BroadcastReceiver를 받고 화면이 On되었을 시에 PendingIntent를 이용하여 띄우고자 하는 LockscreenActivity를 send()해주면 간단하게 끝납니다.


다음은 Service쪽의 소스입니다. 역시 간단합니다. 위에서 말한 명시적 방법으로 filter를 등록한 후에 사용하시면 됩니다. 이렇게 되면 화면이 On되었을 시에 Service class에서 돌고 있다가 BroadcastReceiver class가 On Event를 잡게 되고 PendingIntent를 통해서 LockscreenActivity를 뿅!하고 띄워 주게 되는 겁니다. 지금까지 간단한 Lockscreen을 만들기 위한 방법이었고 제가 만들고자 하는 Lockscreen에 대한 소개를 하도록 하겠습니다.

On Locker는 최근 스마트폰의 수량이 급증하면서, 사람들이 조금 더 편하게 스마트폰 사용하기 위한 방법에서부터 시작하였습니다. 어떻게 하면 조금 더 빨리 자기가 원하는 어플리케이션에 접근 할 수 있는가가 그 모티브가 되었는데요. 이 어플리케이션으로 궁극적으로 사용자가 조금 더 빨리 어플리케이션으로 접근 하여 보다 편리 스마트폰을 이용 할 수 있음을 목적으로 하고 있습니다.

본 프로그램은 크게 세 단계로 나눠 그 기능적 특징을 서술할 수 있습니다.

첫째, Locker 기능이다.

사용자는 기존의 Locker와 동일하게 On Locker 어플리케이션을 사용해 Pattern Lock을 걸거나 풀 수 있다.

둘째, 빠른 어플리케이션 접근 기능이다.

사용자는 기존의 Locker에서 추가로 Lock을 최대 3개까지의 Pattern으로 걸 수 있다. 각각의 Pattern은 기존에 사용자가 설치한 어플리케이션 중 원하는 어플리케이션으로 바로 접근할 수 있는 Pattern이다. 원한다면 언제든 그 Pattern을 지울 수 있다.

셋째, 날씨 정보 제공

기존 Android의 기본 Locker는 패턴과 시간 이외에는 다른 정보를 주지 않는다. 하지만 On Locker는 날씨 정보를 잘 활용하여 UI를 조금 더 개선하였다. 사용자는 조금 더 편하게 날씨 정보를 알 수 있을 것이다.


간단하게 설명해서 기존에 Lock을 걸기 위한 Pattern만이 존재하였다면 저는 그 Pattern을 1-Depth로 접근할 수 있는 Application에 접근할 수 있는 Key로 이용해보고자 하였습니다.


Application을 실행하게 되면 자신의 Device에 깔려 있는 Application의 목록을 List화 시켜서 볼 수 있습니다. 이중에서 자신이 바로 실행 시키고 싶은 Application을 선택하도록 합니다.


메모를 택하였다면 바로 메모로 접근 할 수 있는 자신만의 Pattern을 그리도록 합니다. Pattern을 그리고 확인으로 한번더 그리게 되면 이제 그 Pattern은 메모Application을 바로 실행시킬 수 있는 Pattern으로 등록이 되게 됩니다. 근데 한가지 의문점이 생깁니다. 이 Pattern을 어떻게 다시 이용할 수 있을까요? 어딘가에 저장이 되어 있어야 되는데 말이죠. db를 써서 프로그래밍을 할 수도 있겠지만 보다 간단한 방법이 있습니다. 제가 저장하고 싶은 데이터는 일련의 숫자배열뿐이기 때문에 굳이 어렵게 돌아갈  필요가 없기 때문이죠. 이럴 때 간단하게 phone의 어딘가에 등록하기 위하여 쓰는 class가 Sharedpreference  클래스입니다.

안드로이드에서 SharedPreference를 이용하면 어플리케이션에 연관된 간단한 데이터(String, int, boolean, 등등)들을 쉽게 파일시스템에 저장하고 가져올 수 있습니다.

데이터는 항상 키와 데이터가 짝으로 저장됩니다. 키를 통해서 데이터를 저장하고 또 가져올 수 있습니다. 



이렇게 하여 저장된 Data를 불러올 수가 있고


이렇게 하면 Data를 저장할 수가 있습니다.

이렇게 비밀키를 저장하고 Application을 끄고 나서 화면을 껐다가 다시 키게 되면!!!!!!

짜잔!!하고 이렇게 화면이 뜨게 됩니다. 오늘은 구름 낀  날씨라서 9개의 Dot가 구름으로 표시가 되네요. 보다 직관적으로 그날의 날씨를 사용자에게 보여주고 싶었고 이러한 정보를 디자인적인 요소로 이용해 보고 싶었습니다. 그날의 날씨에 대한 정보를 Parsing해 와서 각 이미지 별로 Matching을 시켜서 그날의 날씨에 따라 직관적으로 Lockscreen을 보고 사용자가 날씨를 알 수있도록 구현해보았습니다.




총 6개의 Dot가 존재하고 왼쪽위에서 부터(시계방향으로 ) 비,눈,구름,안개(바람),해,기본 으로 구성해보았습니다.

아직 마켓에 올리지는 않았지만 조만간 더욱 완벽하게 구현하여 올려볼 생각입니다. 여러분들도 좋은 아이디어가 있다면 한번쯤 만들어서 올려보는 것도 좋은 기회이자 경험일 것이라 생각합니다. 뛰어난 기술력도 중요하지만 뛰어난 창의력 못지 않게 개발자에게 필요한 자질이라고 생각하는 1인으로써 다양한 각도에서의 접근 및 시도가 중요하다라고 말씀드리고 싶으면서 이번 Posting을 마치고자 합니다. 끝까지 읽어주셔서 감사합니다.