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()에 들어온 메시지를 메시지명으로 비교해서, 수행할 작업을 구현한다.
[다운로드]
전체소스
'Android' 카테고리의 다른 글
[Android] Activity Jump #1 "홈 액티비티로 이동하기" (0) | 2012.01.30 |
---|---|
[Android] Animated "ListView" Demo (0) | 2012.01.19 |
[Android] Transparent Activity 만들기. 그리고, 빈 공간을 터치하면 종료하기 (1) | 2012.01.13 |
[Android] Activity "생명주기" 관련 테스트 (14) | 2012.01.12 |
[Android] Device Screen 관련 용어 정리 (0) | 2012.01.11 |