본문 바로가기

Android/BroadCastReceiver

안드로이드/Android BroadCastReceiver 란?


 < 개발 환경 > 
   SDK 버전 : 안드로이드 SDK 2.2  
   API LEVEL : 8 
   이클립스 버젼 : Indigo
   테스트단말 : 삼성갤럭시 S2



안드로이드/Android BroadCastReceiver 란? 



안드로이드 프로그램을 개발 하시면서 4가지 컴포넌트가 존재 한다는 사실은 한번쯤은 들어 보셨을텐데요. 4가지 컴포넌트란 응용프로그램을 구성하게 되는 4가지 중요한 부품이라고 생각하시면 되는데요.! 컴포넌트의 종류로는 Activity, Service, Content Provider, BroadCastReceiver 가 존재 합니다.


우리가 가장 많이 사용하는 컴포넌트로는 Acitivity 가 존재하는데요.! Activity는 사용자에게 보여 지는 하나의 화면이라고 생각하시면 됩니다. 그 화면에 개발자들이 View를 넣고 이벤트를 달며, List를 뿌려 사용자와 소통 하게 되는 것 이 지요.! 


자 그러면, 오늘 배워볼 BroadCastReceiver란  무엇 일까요? 바로.. 방송알림? 정도로 생각하시면 되겠는데요. 단말기안에서는 무수히 많은 일들이 벌어지고 있습니다. 배터리가 부족해질 경우가 있고, SMS 메시지가 도착하는 경우도 있고, 전화가 오는 경우도 있고, 스크린 화면이 꺼지는 경우도 있습니다. 


이러한 일들이 무수히 많이 벌어지고 있는데요.! 이러한 일들을 개발자가 항상 확인해야 한다고 하면, 너무나 비효율적이고 어려운 작업이 될 것 입니다. 그래서 안드로이드에서는 BroadCastReceiver 라는 방송알림 기능을 제공하고 있는데요. 어떠한 특정 작업이 벌어질 경우. 그것을 받고자 하는 곳에 알려주는 기능을 합니다.


요청을 받기 위해 설정 하는 방법은 AndroidManifest.xml 에 <receiver></receiver>를 설정해 주는 방법과, 코드에서 Receiver를 등록해 주는 방법이 있지만 여기에서는 xml에 Receiver를 추가하는 방법으로 설명해 보겠습니다. 결국에 선언에 차이이지 작동하는 원리는 같기 때문 입니다.


package arabiannight.tistory.com.sendreciver;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class TestSendReciverActivity extends Activity implements OnClickListener{
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button btn = (Button) findViewById(R.id.btn_send);
        btn.setOnClickListener(this);
    }

	@Override
	public void onClick(View v) {
		sendBroadcast(new Intent("arabiannight.tistory.com.sendreciver.gogogo"));
	}
}



위의 예제에서는 Intent에 Action 을 추가해서 BroadCast를 전송하는 방법을 사용하고 있는데요.! 그 이유는 xml에 선언된 Receiver에 "arabiannight.tistory.com.sendreciver.gogogo"  Action 이 들어오면 즉각 나한테 알려 달라는 Intent Filter를 선언해 놨기 때문입니다. 그러므로 해당 Action을 호출 하게 되면, Receiver가 해당 Action을 바로 잡아서 실행하게 되는 것이지요. 자 바로 xml 파일로 확인해 보겠습니다.


<?xml version="1.0" encoding="utf-8"?>


    

    
        
            
                
                
            
        
        
        
            
                
            
          
        
    



자 밑에 액션을 선언한게 보이시나요? <action android:name="arabiannight.tistory.com.sendreciver.gogogo" /> 바로 이녀석이 해당 Action을 받겠다고 선언해준 부분입니다. 그렇기 때문에 Activity에서 호출한 Action을 받아서 처리 할 수 있는 것 입니다. 자 그러면 Receiver 소스를 보겠습니다.


package arabiannight.tistory.com.sendreciver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class TestReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		
		String name = intent.getAction();
		
		if(name.equals("arabiannight.tistory.com.sendreciver.gogogo")){
			Toast.makeText
			(context, "정상적으로 값을 받았습니다.", Toast.LENGTH_SHORT).show();
		}
	}
}



BroadCastReceiver를 사용하기 위해서는 BroadcastReceiver객체를 상속받아서 만들어 줘야 하는데요.! IntentFilter에 걸린 intent들은 onReceive 메서드로 들어 오게 됩니다. 그 후 intent의 Action값에 따라 나눠서 코드를 구현해 주면 되겠습니다.


그러면, 위에서 말씀드렸었던 배터리나, 전화, 메시지가 올경우는 어떻게 처리해야 할까요??!! 그것은 시스템에서 바로 호출을 해주게 됩니다. 메시지가 올경우 시스템에서는 "android.provider.Telephony.SMS_RECEIVED" 라는 Action을 호출해 줍니다. 이 Action을 Filter에 등록한 Receiver 들은 해당 Ation을 사용 할 수 있게 되는 것이지요. 또 한 메시지 도착 시점에서 notification이나, 팝업을 통해 사용자에 알려 주는 것 도 가능 하게 됩니다.


전화나, 배터리, 재부팅 등 도 해당 Action으로 시스템에서 호출을 해주니 잘 필터링해서 사용하시면 됩니다. 아참 중요한 것은 해당 Receiver를 사용하기 위해서는 퍼미션을 사용해야 하는 경우가 대부분이니 이점 유의해 주시기 바랍니다.!


PS. 아 Receiver를 Reciver로 ㅠ 오타 났네요 헉..!! 감안하고 봐주세요 ㅎㅎ


파일첨부 : 


TestSendReciver.zip




스크린샷 :