Android 로컬 브로드캐스트

Android 로컬 브로드캐스트 LocalBroadcastManager

중요 공지: LocalBroadcastManager는 AndroidX에서 더 이상 사용되지 않습니다(Deprecated). 공식 문서에서는 앱 내 통신에 LiveData / Flow 사용을 권장하지만, 면접에서는 여전히 출제됩니다.

1. 로컬 브로드캐스트란? (글로벌 브로드캐스트와 비교)

글로벌 브로드캐스트 (앞서 배운 sendBroadcast / sendOrderedBroadcast)

  • 시스템 AMS를 거치며 앱 간 통신(Cross-App)이 가능해 모든 앱이 해당 브로드캐스트를 수신할 수 있음
  • 보안 위험: 데이터가 다른 앱에 쉽게 노출될 수 있고, 다른 앱이 가짜 브로드캐스트를 보내 우리 앱을 공격할 수도 있음

로컬 브로드캐스트 LocalBroadcastManager

  • 브로드캐스트가 현재 앱 내부에서만 순환하며 시스템 글로벌 브로드캐스트 메커니즘을 거치지 않음. 다른 앱은 전혀 수신할 수 없음 ✅ 장점:
  1. 보안: 브로드캐스트가 외부 앱으로 유출되지 않으며, 외부 앱이 가짜 브로드캐스트를 보낼 수 없음
  2. 고성능: 프로세스 간 통신이나 시스템 AMS와의 상호작용이 필요 없어 속도가 빠름
  3. 권한 선언 불필요 단점:
  4. 동적 등록만 지원. 정적 등록(AndroidManifest에 receiver 선언)은 무효
  5. 같은 앱 내에서만 유효하며, 프로세스나 앱을 넘나들 수 없음
  6. 시스템 브로드캐스트와 함께 사용할 수 없음

2. 전체 코드 분석

2.1 커스텀 리시버 MyReceiver

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Toast.makeText(context, "로컬 브로드캐스트를 수신했습니다", Toast.LENGTH_LONG).show();
    }
}
Code language: PHP (php)

2.2 Activity에서 LocalBroadcastManager 사용하기

package cn.bamn.www.localcastdmeo;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private LocalBroadcastManager localBroadcastManager; // 로컬 브로드캐스트 매니저 참조
    private IntentFilter intentFilter;
    private MyReceiver myReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // LocalBroadcastManager 싱글톤 인스턴스 가져오기
        localBroadcastManager = LocalBroadcastManager.getInstance(this);

        Button button = (Button) findViewById(R.id.btn_send);
        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                // Intent Action 구성 및 로컬 브로드캐스트 전송
                Intent intent = new Intent("com.foxdevelop.www.LocalCastDemo.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);
            }
        });

        // 로컬 브로드캐스트 리시버 동적 등록
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.foxdevelop.www.LocalCastDemo.LOCAL_BROADCAST");
        myReceiver = new MyReceiver();
        localBroadcastManager.registerReceiver(myReceiver,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 반드시 등록 해제! 메모리 누수 방지
        localBroadcastManager.unregisterReceiver(myReceiver);
    }
}
Code language: JavaScript (javascript)

핵심 API:

  • LocalBroadcastManager.getInstance(context): 인스턴스 가져오기 (싱글톤)
  • registerReceiver(receiver, intentFilter): 리시버 동적 등록
  • sendBroadcast(intent): 순서 없는 로컬 브로드캐스트 전송; sendOrderedBroadcast()는 순서 있는 로컬 브로드캐스트
  • unregisterReceiver(): 페이지 소멸 시 등록 해제 — 반드시 작성해야 하며, 메모리 누수의 함정

3. 로컬 브로드캐스트 vs 무순서 글로벌 브로드캐스트 vs 순서형 글로벌 브로드캐스트 비교 요약

유형통신 범위앱 간 통신중단 가능 여부등록 방식내부 메커니즘
글로벌 무순서 브로드캐스트 sendBroadcast글로벌가능abort 불가정적+동적시스템 AMS 프로세스 간 통신
글로벌 순서형 브로드캐스트 sendOrderedBroadcast글로벌가능abortBroadcast로 중단 가능정적+동적시스템 AMS 프로세스 간 통신, priority 순 직렬 처리
로컬 브로드캐스트 LocalBroadcastManager앱 내부불가능순서형 브로드캐스트 중단 지원동적 등록만메모리 내 분배, AMS 미사용, 고효율

Android 로컬 브로드캐스트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다