본문 바로가기

소프트웨어/Android/Java/Ndk

Android] BroadcastReceiver 등록

git : https://github.com/ManSung-Kim/SMSForwardMS/blob/master/src/com/jactlab/smsforwardms/service/SMSReceiverMS.java

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하게 만들면 더 좋다.