이번에는 서비스와 리시버에 대해서 공부해 보았습니다.

서비스

더보기



리시버

더보기



제가 하려는건
Service를 돌리면서 일정 시간마다, 
윤하의 트위터를 받아와 새로 쓴 트윗이 있는 경우 Notification으로 알림을 해주는 것입니다.
이때, Device가 꺼졌다 켜졌을 경우, 서비스가 죽어있기 때문에, 
Receiver를 사용해 Device가 완료되었을 경우의 액션(BOOT_COMPLETED)이 발생했을 때를 체크해
Service를 시작하는 것 까지입니다.

정리해 보자면,

1. 서비스가 돌면서 새 트윗이 있는지 비교한다.
2-1. 새 트윗이 있는 경우 Notification으로 알림메시지를 띄운다.
2-2. 새 트윗이 없는 경우 아무일도 하지 않는다.
3. Device reboot 시 서비스가 죽을 것을 대비해, Receiver를 통해 부팅이 된 경우 서비스를 시작한다.

간단하게는 이렇게 세가지 입니다.






1. 서비스가 돌면서 새 트윗이 있는지 비교한다.
2-1. 새 트윗이 있는 경우 Notification으로 알림메시지를 띄운다.
2-2. 새 트윗이 없는 경우 아무일도 하지 않는다.


서비스를 만듭니다.

먼저 service 클래스를 만듭니다.


이 서비스는 핸들러 스레드를 사용해서 5분에 한번씩 run메소드를 실행시켜서 윤하의 트윗을 받아오고
시간을 비교해 주는 서비스입니다.(실제로 윤하 팬플에서 사용하고 있는 코드)
핸들러에서  postDelay에 얼마만큼의 시간이 흐른뒤 다시 실행할지에 대해서 넣어주면 됩니다.


AndroidManifest.xml 아래의 코드를 추가합니다.

이렇게 만든 서비스를 시작하기 위해서는 어플리케이션 어딘가에서 아래의 코드를 쓰기만 하면 됩니다.

startService(new Intent("YounhaFanpplService"));

중요한 포인트는 서비스를 만들고 매니페스트에서 그 서비스의 인텐트 필터, 액션을 만들어 주어야 한다는 것이지요.
이렇게만들어 두면, 저 액션 네임만 가지고 어디서든 서비스를 시작할 수 있습니다.



3. Device reboot 시 서비스가 죽을 것을 대비해, 
    Receiver를 통해 부팅이 된 경우 서비스를 시작한다.


리시버의 코드는 서비스보다 훨씬 간단합니다.
리시버가 실행됬을때,
즉, 어떤 액션인가를 리시브 했을 경우에
그 액션이 내가 원하는 액션이라면(이건 여러 액션을 intent-filter에 정의해 놨을때를 대비한것) 
내가 하려는 명령을 실행하면 되는것입니다.

여기서는 목적에 맞도록
내가 받은 인텐트 액션이 android.intent.action.BOOT_COMPLETED 인 경우에 
서비스를 시작하도록 코드를 구현하였습니다.  




리시버 역시, 액션을 등록해야합니다.
매니페스트 파일에 아래와 같은 액션을 등록해줍니다.


이렇게 해 두면, 부팅이 완료된 이벤트(액션)이 발생했을때,
YounhaAutoStartAlarmReceiver 가 그 액션을 받아서 서비스를 시작하는 것입니다.



간단하게 전부를 정리해 보면,
1. 서비스를 만들고 매니페스트에서 서비스의 인텐트 필터 부분에 액션을 등록한다.
2. 리시버를 만들고 매니페스트에서 리시버의 인텐트 필터 부분에 액션을 등록한다.
이 두줄로 설명할 수 있겠네요 ^^




- 서비스에 대한 개념은 PhoneRankingService를 만든 j2enty님과 얘기를 하며 많은 도움을 얻었습니다.





이렇게 서비스와 리시버를 구현해 놓은 경우라 하더라도
어플스토커나 여러 task killer등에 의해 강제로 종료되는 경우가 허다한데요,
그런 경우에는 태스크 킬러에서 ignore 해 두면 종료되지 않고 사용할 수 있습니다.

가끔 태스크 킬러에서 강제로 서비스를 종료 할때, 
서비스 생명주기의 onDestroy()에 들르지 않는다는 얘기가 있던데,
이런 부분은 확인을 해보아야 할 부분이겠지요.(아직 확인은 못해봤습니다. 2.2에선 잘 안죽더라구요 ㅋ)




- 팬플들의 트위터에서 인증에 사용하는 팬플 트윗츠 아이콘 -

팬플을 만드는데 지대한 공헌을 해주신 
카류님(karyurid)과, 제 별자리를 알파값을 주어 겹치게 해서 만든 아이콘 입니다.



Posted by croute

댓글을 달아 주세요

  1. BlogIcon 지나가는공부생 2012.01.16 17:09  댓글주소  수정/삭제  댓글쓰기

    3.1 버전에서는 Activety 없는 service app 같은경우는 못받더라구요 한번 실행을 해줘야 받네요
    BOOT_COMPLETED broadcast를 요

  2. 정재현 2012.05.08 14:18  댓글주소  수정/삭제  댓글쓰기

    카톡하시면 ㅜㅜ여쭈어볼께많네요
    only340입니다. ㅎ

    제가 궁금한것은 지금.리시버를 어디서 등록하고 삭제햇느냐 입니다.

    제가 뮤직플레이어를 혼자개발중인데 노래를 서비스를 듣고 잇을때 전화가 왓을시 노래룰 Pause를 시키고 전화가 끊히면 play를 시켜야하는데 리시버를 액티비티에 등록하면 해당이벤트를 잡을수없을텐데 서비스에.등록해야할까요? 만약 서비스에 등록해야한다면 언제 등록하고 삭제룰 해야할까요

    • Favicon of https://croute.me BlogIcon croute 2012.05.09 03:37 신고  댓글주소  수정/삭제

      뮤직이 백그라운드로 플레이 되는거죠?

      리시버의 인텐트 필터에 액션으로 등록해 두고,
      서비스에 접근하면 되지 않을까요?

      전화상태가 변경될때를 Receiver로 받아서, 각 상태에 맞는 이벤트를 처리해주시면 될거에요.

      아래 링크 참고하세요~
      http://daddycat.blogspot.com/2011/05/android-broadcastreceiver-event-catch.html

  3. Favicon of http://devflow.kr BlogIcon regame 2012.08.08 17:26  댓글주소  수정/삭제  댓글쓰기

    좋은글 잘 보았습니다.. 정리를 예제로하여끔 잘 성명해주셧넹요

  4. BlogIcon cobus 2013.05.04 16:33  댓글주소  수정/삭제  댓글쓰기

    실제 원하는 서비스를 어떻게 구현해야 하는지 삽질 많이 했는데
    이거 보고 해결했네요. 복받으세요. ㅋㅋ