git 링크는 sms를 recv하는 프로젝트다. 이 프로젝트를 base로 설명을 할 것임.
BroadcastReceiver는 Android에서 Process간 통신에(IPC) 사용하는 한 방법이다. Class 이름처럼 광역으로 날라오는 Event를 Receving한다.
광역으로 날라오는 Event(정확히는 Intent)는 여러 종류가 있는데, 위에 링크한 git에서 사용하는 sms data가 있을수도 있고 전화가 왔을때의 Event, 그리고 시간이 바뀔때의 Event 등 Android Framework에는 무수히 많은 Event가 존재한다. 물론 사용자 정의 Event도 존재한다.
혹시 모르는 사람은 참고되라고 글 남겨놓는다.
# Manifest에 등록
xml에 명시적으로 <receiver/>를 선언하거나 Main source 상에서 register를 진행해도 된다. 이 부분은 나중에 길게 설명 할 것이다. 일단, 등록 안해도 된다.
# BroadcastReceiver를 상속받는 Class 구현(SMSReceiverMS.java)
소스는 아래와 같다. Broadcast를 수신하고자 한다면 다른 소스는 다 때고
public void onReceive(Context context, Intent intent) {
만 보면 된다. 이 부분이 실질적으로 광역으로 전송된 Intent를 수신하는 부분이다. Intent에 실려오는 정보는 Integer가 될 수도있고, String이 될 수도 있고, Bundle형태로 실려올수도있고..Parcel형태로 실려올수도있고.. 무수히 많은 종류로 전송이 가능하다.
아래의 소스는 android.provider.Telephony.SMS_RECEIVED 라는 action을 처리하려는 의도의 코드다.
final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onReceive(Context context, Intent intent) { String lAction = intent.getAction(); if( lAction.equals(SMS_RECEIVED) ) {
# Main에서 Receiver 등록
동작해야할 로직을 정의했으니 Main문에서 이 로직을 실행 가능하게 등록 해야한다. 위에서 생성한 BroadcastReceiver를 상속받는 Class의 Instance를 생성하여 Activity(->ContentThemeWrapper->ContentWrapper)가 제공하는 registerReceiver()를 이용하여 Receiver를 등록한다.
registerReceiver를 call 하기 전 IntentFilter란 instance를 생성하는데, 이 부분이 내가 생성한 BroadcastReceiver가 어떤 Action을 갖는 Event를 받아들일지 지정해주는 부분이다.
final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; private BroadcastReceiver pmSMSReceiver = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pmSMSReceiver = new SMSReceiverMS(); IntentFilter lIFilter = new IntentFilter(SMS_RECEIVED); registerReceiver(pmSMSReceiver, lIFilter); }
# Receiver 삭제
사용이 끝난 Receiver는 삭제를 해줘야한다. 삭제를 해주지 않으면 Memory leak이나 Segmentation Falut 등의 오류를 발생시킬 수 있다.
삭제는 onDestroy에서 수행했다. 보통 내가 구현할때는 Receiver Instance도 null로 만들어준다.
@Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if( pmSMSReceiver != null ) { unregisterReceiver(pmSMSReceiver); pmSMSReceiver = null; } }
이렇게 하면 기본적인 BroadcastReceiver의 구현이 완성된다. 다만 Receiver는 혼자서 동작하기보다는 Service상에서 구현하는게 더 효과적인 동작을 수행할 수 있으므로 Service에서 register하게 만들면 더 좋다.
끝
'소프트웨어 > Android/Java/Ndk' 카테고리의 다른 글
JUnit4] Android Studio에서 Test환경 셋팅 (0) | 2021.07.01 |
---|---|
Android12 변경사항 훑어보기 (0) | 2021.03.11 |
Android] sms 읽기(문자 이벤트) (0) | 2016.06.14 |
android] WebView 안멈춤 현상, WebView 계속 소리남 (0) | 2016.02.18 |
android] WindowManager UpdateViewLayout이 벌벌벌 떨릴때 (0) | 2016.02.18 |
android] chat head (0) | 2016.02.13 |
android] YouTubePlayer 객체가 파괴되는듯하다.. (0) | 2016.02.11 |