티스토리 뷰

   BroadCast Receiver란 

안드로이드 4대 컴포넌트 중에 하나이다. 말 그대로 방송 수신자이며 시스템이나 앱 등에서 이벤트 발생시 방송을 해주는 개념이다. 이렇게 방송된 이벤트는 각 앱에서 필요한 방송 이벤트를 받아들이고 이벤트에 대한 처리를 리시버를 통해 할 수 있게 해준다.



   SendBroadCast 방송 보내기 

SendBroadcast라는 Context에 포함된 함수를 이용하여 인텐트를 전달한다. Intent에 putExtra를 통해 Integer, boolean, String 등 여러 단일 타입 또는 배열의 혈태로 전달 할 수 있다. 

Intent sendIntent = new Intent("com.dwfox.myapplication.SEND_BROAD_CAST");
sendIntent.putExtra("isBoolean", true);
sendIntent.putExtra("sendInteger", 123);
sendIntent.putExtra("sendString", "Intent String");
sendBroadcast(sendIntent);


   Receiver 방송 받기

SendBroadcast를 통해 전달된 Intent를 수신하는 리시버(Receiver)를 구현하여야 한다. 리시버에는 정적리시버와 동적 리시버가 있다.


정적 리시버 : 한 번 등록하면 해제할 수 없다.

정적리시버는 AndroidManifest.xml에서 recevier를 등록하여 사용하도록 한다. 아래와 같이 리시버를 사용할 클래스와 intent Action name을 등록한다.

<receiver android:name=".TestReceiver">
   <intent-filter>
      <action android:name="com.dwfox.myapplication.SEND_BROAD_CAST"/>
   </intent-filter>
</receiver>


브로드캐스트 리시버 (BroadcastReceiver) 클래스를 구현하여 수신 처리를 등록한다.

public class TestReceiver extends BroadcastReceiver {

    private static final String TAG = TestReceiver.class.getSimpleName();
    @Override
    public void onReceive(Context context, Intent intent) {
        String name = intent.getAction();
            // Intent SendBroadCast로 보낸 action TAG 이름으로 필요한 방송을 찾는다.
	   if(name.equals("com.dwfox.myapplication.SEND_BROAD_CAST ")){ 
            Log.d(TAG, "BroadcastReceiver :: com.dwfox.myapplication.SEND_BROAD_CAST :: "
            + intent.getStringExtra("sendString")); // putExtra를 이용한 String전달
         }
    }
}



동적 리시버 : 등록과 해제가 자유롭다.

정적리시버와는 달리 AndroidManifest.xml에 추가로 입력 할 사항이 없다.

public class TestActivity extends Activity {

    private static final String TAG = ReceiverVideoFinish.class.getSimpleName();
    BroadcaastReceiver mReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //브로드캐스트의 액션을 등록하기 위한 인텐트 필터
        IntentFilter intentfilter = new IntentFilter();
        intentfilter.addAction("com.dwfox.myapplication.SEND_BROAD_CAST");

        //동적 리시버 구현
        mReceiver = new BroadcastRecevier(){
            @Override
            public void onRecevie(Context context, Intent intent){
                String sendString = intent.getStringExtra("sendString");
                Log.d(TAG, sendString);  
            }
        };

        //Receiver 등록
        registerReceiver(mReceiver, intentFilter);
    }
    //등록된 Receiver는 반드시 해제 해주어야 한다.
    unregisterReceiver(mReceiver);
}

동적리시버는 등록과 해제가 자유롭게 이루어짐으로서 필요한 부분에 리시버를 등록하고 해지하면서 시스템이나 앱에 부하를 줄일 수 있다. 하지만  해제를 적절하게 해주지 않으면 메모리 릭이 발생한다.

댓글
  • 프로필사진 나그네개발자 BroadcaastReceiver mReceiver;
    caast로 오타가 있네요.

    mReceiver = new BroadcastRecevier()
    Recevier도 오타네요.

    onRecevi, intentFilter 이것도 오타...
    여기까지만요. 수고하세요.
    2018.12.19 15:56
댓글쓰기 폼