[Android] 서비스와 브로드캐스트 수신자
안드로이드 앱을 구성하는 네 가지 요소 중 액티비티에 대해서는 지금까지 살펴봤고, 이제 서비스와 브로드캐스트에 대해 알아보자.
액티비티와 달리 서비스와 브로드캐스트는 화면을 담당하지 않는다. 문자메세지가 도착했을 때 내가 만든 앱에서 수신하게 하고 싶을 때 브로드캐스트를 사용한다.
서비스
서비스는 액티비티와 달리 화면이 없는 상황에서 백그라운드에서 실행되고, 프로세스가 종료돼도 시스템에서 자동으로 재시작한다.
매니페스트 파일에서 <service> 태그를 사용해 선언한다. (개발 도구로 생성 시 보통 자동으로 추가됨)
onCreate() : 서비스가 만들어 질 때 해야 할 일을 이쪽에 정의한다.
onStartCommand() : 서비스가 호출될 때 마다 해야 할 일을 정의한다.
onDestroy : 서비스가 종료될 때 해야 할 일을 정의한다.
서비스가 시작하기 위해서 bindService() / startService() 메서드를 호출하고, 종료할 때는 stopService() unbindService() 메서드를 호출한다. 매개변수로 받는 인텐트는 어떤 서비스를 실행시킬 지 결정한다. 둘의 차이로는, startSercie() 메서드는 서비스를 호출하고 대기시간 동안 다른 일을 할 수 있다. (편지를 보낼 때 보내놓고 다른 일을 한다. 비동기적.) bindService() 메서드는 전화 거는 것과 비슷하다. 전화를 끊기 전까지는 다른 작업을 할 수 없다. 동기화라고 표현한다. 한 번 세션이 연결되면, 끊기기 전 까지 서비스와 요청하는 액티비티가 계속해서 데이터를 주고받을 수 있다.
서비스는 다른 구성 요소들처럼 메인 스레드에서 동작한다. 서비스 내에서도 다른 동작이 필요하면, 별도의 스레드를 만들어서 처리한다. 자세한 건 스레드를 공부하고 이해하자.
이제 코드를 통해 알아보자.
서비스가 처음 생성될 때 Logcat 에 MyService와 관련된 메세지만 출력하기 위해서 TAG를 만들고 매개변수에 넣어줬다. 태그는 메세지의 카테고리를 구분하기 위해서 사용한다.
서비스가 생성될 때 말고 다른 액티비티로부터 요청을 받을 때 onStartCommand() 메서드가 실행된다. 매개변수로 Intent flags startid를 받는다.
인텐트가 비어있으면, 서비스를 계속 재실행시킨다. (지금은 할 일이 없지만 나중에 대기상태로 가라)
비어 있지 않으면 액티비티로부터의 서비스 요청을 처리하는 부분인 processCommand() 메서드를 호출하고 이 메서드로 처리하도록 한다.
밑에 return 문장은 원래 만들어질 때 부터 존재하는 문장이다.
서비스 요청을 처리하는 부분인 processCommand()는 어떻게 동작하는지 알아보자.
name 과 command 키로 분리해서 String 객체를 만들고 Logcat 창에 출력한다.
위의 코드는 사실 하는 일은 없지만, 확인을 위해 1초마다 잠들었다가 출력하도록 했다.
(1000은 millisecond 단위이고 1초를 의미한다. 자세한 건 스레드를 공부하자.)
서비스는 화면이 없기 때문에 서비스에서 실행한 결과를 보여주기 위해서 액티비티를 만들어야 한다.
전에는 Logcat 창에 메세지를 전달했는데, 이번에는 인텐트 객체를 만들고 액티비티를 실행시켰다.
서비스는 액티비티가 없으니까 NEW_TASK를 만들어야 한다.
기존에 액티비티가 있으면 또 스택에 만들지 말고 스택에 있는걸 사용하도록 했다.
그리고 이 액티비티를 실행시켜줬다.
CLEAR_TOP / SINGLE_TOP 에 대한 부가 설명이다.
위의 키워드를 통해서 스택을 훨씬 깔끔하게 관리할 수 있다.
액티비티에서 다른 액티비티를 만들어 호출하고 그 액티비티에서 결과값을 가져오는 경우에는 onActivityResult() 메서드를 사용해서 결과값을 처리했다.
다른 액티비티나 서비스로부터 인텐트가 전달됐을 때 onNewIntent() 메서드를 정의해서 전달된 인텐트를 처리해준다.
브로드캐스트 수신자
글로벌 이벤트 (여러 가지 메세지, 알림 등등..)를 받아서 처리하려면 브로드캐스트 수신자로 등록해야한다.
브로드캐스트 수신자는 인텐트 필터를 통해서 원하는 메세지만 받게 만들 수 있고, 매니페스트 파일에 등록함으로써 인텐트를 받을 준비를 한다.
서비스처럼 브로드캐스트 수신자도 화면이 없고, 결과물을 보여주려면 액티비티를 만들어야 한다.
인텐트를 이용해 액티비티를 실행하면 foreground로 실행돼 사용자에게 보여지고, 브로드캐스트를 이용해 처리하면 background로 동작해 사용자가 모르게 처리할 수 있다.
일반 브로드캐스트 : sendBroadcast() 메서드로 호출한다. 비동기적으로 실행되고 순서 없이 실행된다. 한 수신자의 처리 결과를 다른 수신자가 이용할 수 없고 중간에 취소할 수 없다.
순차 브로드캐스트 : sendOrderedBroadcast() 메서드로 호출한다. 한 번에 하나의 수신자에게만 전달되고 순서대로 실행된다.
SMS가 전달됐을 때 브로드캐스트 수신자로 확인하는 예제를 살펴보자.
문자 메세지를 받으면 onReceive() 메서드를 호출한다.
메세지인 인텐트를 Bundle 타입으로 받아오고, 문자메세지가 여러 개일 수 있으니 배열로 메세지를 처리한다.
( 지금 예제에서는 문자메세제 한개를 받아온다고 가정한다. [0] )
문자 내용 / 문자 발신자 / 문자 발송 시간을 처리한다. (Logcat으로 처리)
SmsMessage 타입으로 형변환해서 진행한다.
번들 객체로부터 문자메세지를 추출할 때, 버전에 따라서 방법이 달라졌다.
버전에 따라 다르게 처리해줘야 한다.
'Mobile > Android' 카테고리의 다른 글
[Android] 리스트 보여주기 (0) | 2021.11.21 |
---|---|
[Android] 쓰레드와 핸들러 (0) | 2021.11.12 |
[Android] 인텐트와 프로그레스바 사용하기 (0) | 2021.10.28 |
[Android] 여러 화면 간 전환 (0) | 2021.10.25 |
[Android] 대화상자 사용하기 (0) | 2021.10.18 |
댓글
이 글 공유하기
다른 글
-
[Android] 리스트 보여주기
[Android] 리스트 보여주기
2021.11.21 -
[Android] 쓰레드와 핸들러
[Android] 쓰레드와 핸들러
2021.11.12 -
[Android] 인텐트와 프로그레스바 사용하기
[Android] 인텐트와 프로그레스바 사용하기
2021.10.28 -
[Android] 여러 화면 간 전환
[Android] 여러 화면 간 전환
2021.10.25