Nuke Olaf - Log Store

[Android] 안드로이드 - SMS 메시지 받는 브로드캐스트 리시버 구현하기 본문

Android

[Android] 안드로이드 - SMS 메시지 받는 브로드캐스트 리시버 구현하기

NukeOlaf 2019. 11. 25. 16:40

https://bitsoul.tistory.com/tag/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%20BroadcastReceiver

 

위에는 SMS 메시지 파싱하는 코드 보기 좋음...

브로드 캐스트 리시버 등록하는 방법은 여기가 더 잘 설명되어 있다.

https://www.journaldev.com/10356/android-broadcastreceiver-example-tutorial

 

 

 

 

 

 

Broadcast Receiver는 단말기 안에서 이루어지는 수많은 일들을 대신해서 알려준다.

배터리부족, SMS문자메시지, 전화가 오는 일들을 방송알림 해준다.

Broadcast Receiver를 구현하기 위해서는 2가지 방법이 존재한다

1. 코드상에서 broadcast receiver를 등록하는 동적인 방법

2. Manifest.xml에 <Receiver></Receiver>의 형태로 등록하는 정적인 방법

 

1. Manifest.xml에 Receiver 구현하는 정적인 방법

- 브로드캐스트 리시버 java class를 만들어 준다.

- 브로드캐스트 리시버 파일을 manifest에 등록해 준다.

- manifest에 등록한 브로드캐스트 리시버 파일에 인텐트 필터를 추가해 준다.

- 브로드캐스트 리시버 class가 BroadCastReceiver 를 extends 하도록 하고, onReceive()메소드를 오버라이딩 한다.

(onReceive()는 manifest에서 intent-filter를 통해 걸러진 intent를 받아들이는 곳이다. 여기에 특정 인텐트를 받을 떄 특정 행동을 수행하도록 코드를 작성할 수 있다.)

- sendBroadcast()메서드를 통해 braodcastreceiver에게 인텐트가 전달되면, 인텐트 필터를 통해 인텐트가 걸러지고, 특정 인텐트를 받으면 onReceive()에 작성된 코드가 실행된다.

 

2. 동적으로 Receiver 구현하는 방법

이 방법은 Menifest.xml에 따로 receiver를 등록할 필요 없이 MainActivity에서 모든 작업이 이루어진다.

(1) 인텐트 필터 생성 및 액션 등록

(2) 브로드캐스트 익명클래스로 생성 및 구현

(3) 브로드캐스트와 인텐트 등록

(4) 등록한 브로드캐스트 종료

 

3. 정적/동적 브로드캐스트 리시버의 차이점

http://cafe.daum.net/_c21_/bbs_search_read?grpid=1MWA2&fldid=aAfL&datanum=102

동적 리시버는 자신이 등록한 Component의 생명주기가 끝나면 사라진다.

Activity에 리시버를 등록한 경우, Acitivity를 Back Key를 이용해서 종료하게 되면, 리시버도 같이 사라지는 것이다.

즉, onDestroy()가 되면, Receiver가 없어지는 것...ㅠㅠㅠ

그러나, 동적 리시버에는 장점 두 가지가 있다.

1. 시스템에 큰 부하를 주지 않는다

매분마다 발송되는 시스템 Action "android.intent.action.TIME_TICK" 이 있다

이 것은 AlarmManagerService란 서비스가 매 분마다 발송한다.

만일 정적 리시버로 해당 Action을 등록했다면 매분마다 계속 이벤트를 받게 되고,

매 분마다 해당 이벤트에 대한 처리를 할 것이다.

이는 시스템 측면에서 전체적이 성능을 저하시킬 것이다.

하지만 동적리시버는 한 Component의 생명주기 내에서만 해당

이벤트를 받으므로 큰 부하를 주지 않는 것이다.

 

2. 다른 Component 내에 소스가 존재한다

그래서 해당 component 내의 모든 멤버 객체에 접근하고, 그 객체를 참조할 수 있다.

내 앱의 경우, 동적 리시버를 구현하여 해당 액티비티의 댓글이 올라가거나, 좋아요가 올라간 경우, 토스트를 만들거나 이벤트를 발생시킬 생각이다.

 

정적 리시버는 한번등록하면, 쉽게 해체하기 어렵기 때문에 계속적으로 유지가 되는 경향이 있다.

하지만 동적 리시버는 등록과 해체가 유연하기 때문에 등록/해체가 빈번하게 일어나는 경우엔 유리하다.

 

또 동적리시버는 정적리시버와 달리 자신을 등록한 해당 컴포넌트의 생명주기에 영향을 받는다.

그러면서 동시에 해당컴포넌트에 동적리시버를 구현했기 때문에 컴포넌트 안에 있는 변수와 메서드에 대한 

접근이 유연하다.

 

하지만 주의해야할 점도 있다. 동적리시버는 등록과 해체를 자유자재로 할 수 있기 때문에

필요할때만 등록하고 일을 다하면 꼭 해체시켜줘야지 불필요하게 중복으로 리시버를 등록해서는 안된다.

(또 Recevier에서는 bindService가 허용되지 않는다.)

 

여러개의 브로드캐스트를 등록한 경우 순차적으로 한개씩 브로드캐스트가 작업을 하기 때문에 마지막에 일처리를 하는 브로드캐스트는 

작업지연이 심해질 수 있다. 이는 ANR을 발생시킬 여지를 주기 때문에 다중 브로드캐스트 작업시 ANR에 대한 가능성을 염두해서 코딩해야한다.

 

마지막으로 리시버에서 너무 많은 작업, 시간이 오래걸리는 작업을 시키지말자. 만약 리시버로 인한

처리지연시간이 길어질 경우 메인스레드(UIThread)의 딜레이를 안드로이드 시스템에서 가만두고 볼 수 없기 때문에

ANR을 발생시킨다. 따라서 리시버에는 간단한 일을 처리하도록하고, 정 일이 많다면 작업스레드를 별도로 생성해서 처리하도록 하자.

*  ANR : 앱의 비정상 종료 및 애플리케이션 응답 없음 오류

 

https://black-jin0427.tistory.com/28

Broadcast에는 Global BroadcastLocal Broadcast 가 있다

* Global Broadcast : 일반적으로 이야기하는 Broadcast이다. 프로세스 간의 경계를 무시하고, 안드로이드 시스템 상에 등록된 모든 Receiver들에게 전달된다

* Local Broadcast : 현재 프로세스 안에만 유효한 Broadcast이다. 액티비티 내부 객체간의 상호 의존성을 낮추어 깔끔한 프로그램 구조를 만들 수 있고, 해당 앱의 정보를 밖으로 유출하지 않는다.

Comments