AndroidManifest.xml에 BroadcastReceiver를 등록하는 방법이 있는데,
여기서는 런타임시에 한 액비티비 내에서 등록 및 해제하는 방법을 정리한다.
메시지가 많지 않고, 잠깐 등록해서 사용하는 경우 이 방법도 편리하다.


[목표]
액티비티에 버튼을 하나 클릭하면, 숫자를 증가시켜 Intent에 담아, 브로드캐시트 메시지를 쏜다.
onReceive()에서 이를 받아, Toast를 띄운다.
간단하게 한 액티비티 상에서 위의 작업을 수행한다.



[구현하기] 
public class BroadcastReceiverDemoActivity extends Activity implements OnClickListener {
	private final String BROADCAST_MESSAGE = "com.juno.broadcastreceiver.INCREASED_NUMBER";
	private BroadcastReceiver mReceiver = null;
	private int mReiceivedNumber = 0;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        ImageButton button = (ImageButton)findViewById(R.id.iv_send_msg);
        button.setOnClickListener(this);
    }
    
    @Override
	public void onResume() {
    	super.onResume();
    	registerReceiver();
	}
    
    @Override
	public void onPause() {
    	super.onPause();
		unregisterReceiver();
	}
    
    @Override
	public void onDestroy() {
    	super.onDestroy();
	}
    
    @Override
	public void onClick(View v) {
		int id = v.getId();
		
		switch (id) {
		case R.id.iv_send_msg:
			Intent intent = new Intent(BROADCAST_MESSAGE);
			intent.putExtra("value", mReiceivedNumber);
			mReiceivedNumber++;
			sendBroadcast(intent);
			break;
		default:
			break;
		}
	}
    
	private void registerReceiver() {
		
		if(mReceiver != null)
			return;

		final IntentFilter theFilter = new IntentFilter();
        theFilter.addAction(BROADCAST_MESSAGE);

        this.mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
            	
				int strNewPostion = intent.getIntExtra("value", 0);
				if (intent.getAction().equals(BROADCAST_MESSAGE)) {
					Toast.makeText(BroadcastReceiverDemoActivity.this, "number=" + strNewPostion, Toast.LENGTH_SHORT).show();
				}
        	}
        };

        this.registerReceiver(this.mReceiver, theFilter);
	}
	
	private void unregisterReceiver() {
		if(mReceiver != null)
			this.unregisterReceiver(mReceiver);
	}
}
  
Line 02 : 메시지 명칭이다. 메시지를 수신할 때, onReceive(...)에서 받는 여러 메시지들을 분류할 때 사용할 Key값이다.
 

Line 18 : onResume()에서 준비해 놨던 registerReceiver() 함수를 호출한다.
 

Line 24 : onPause()에서 준비해 놨던  unregisterReceiver() 함수를 호출한다. onDestroy()함수가 호출이 되지 않는 경우도 있으니, onPause()가 안전하다. 리시버를 해제하지 않으면 오류가 발생하므로,  unregisterReceiver()의 위치는 상황에 맞춰서 잘 배치해야 한다.
 

Line 38~41 : 송신측 작업 ; "value" 키 값과, 데이터(숫자) 하나를 담아서 보낸다.
 

Line 54,67 : 리시버 등록 작업 ; 메시지 명칭을 필터에 적어논다.
 

Line 67 : 리시버 등록 작업 ;  준비해놓은 리시버와 필터 인스턴스로 현재의 액비티비에 리시버 등록을 완료한다.
 

Line 60 수신측 작업 ; 송신한 쪽에서 보낸, 데이터를 받는다.
 

Line 61 수신측 작업 ; onReceiver()에 들어온 메시지를 메시지명으로 비교해서, 수행할 작업을 구현한다.


[다운로드] 
   전체소스



Posted by 데브로망스

댓글을 달아 주세요

  1. ㄱㄷㄱ 2012.04.19 09:48  댓글주소  수정/삭제  댓글쓰기

    소스보고 잘 적용했습니다. 감사합니다.

    다만 하나 말씀드리고 싶은 것이 있습니다 unregisterReceiver 메소드에서
    mReceiver = null;을 넣어줘야 합니다.
    이 조건을 안 넣으면 onPause에 빠졌다가 다시 onResume으로 돌아왔을때 mReceiver이 null이 아니므로 registerReceiver메소드에서 바로 return을 해버립니다. 그래서 Broadcast를 받을 수 없게 됩니다.

  2. 김병희 2017.01.06 19:45  댓글주소  수정/삭제  댓글쓰기

    잘 쓰겠습니다.
    감사합니다.
    덧글 공감합니다.