Android 로컬 브로드캐스트 LocalBroadcastManager
중요 공지:
LocalBroadcastManager는 AndroidX에서 더 이상 사용되지 않습니다(Deprecated). 공식 문서에서는 앱 내 통신에LiveData/Flow사용을 권장하지만, 면접에서는 여전히 출제됩니다.
1. 로컬 브로드캐스트란? (글로벌 브로드캐스트와 비교)
글로벌 브로드캐스트 (앞서 배운 sendBroadcast / sendOrderedBroadcast)
- 시스템 AMS를 거치며 앱 간 통신(Cross-App)이 가능해 모든 앱이 해당 브로드캐스트를 수신할 수 있음
- 보안 위험: 데이터가 다른 앱에 쉽게 노출될 수 있고, 다른 앱이 가짜 브로드캐스트를 보내 우리 앱을 공격할 수도 있음
로컬 브로드캐스트 LocalBroadcastManager
- 브로드캐스트가 현재 앱 내부에서만 순환하며 시스템 글로벌 브로드캐스트 메커니즘을 거치지 않음. 다른 앱은 전혀 수신할 수 없음 ✅ 장점:
- 보안: 브로드캐스트가 외부 앱으로 유출되지 않으며, 외부 앱이 가짜 브로드캐스트를 보낼 수 없음
- 고성능: 프로세스 간 통신이나 시스템 AMS와의 상호작용이 필요 없어 속도가 빠름
- 권한 선언 불필요 단점:
- 동적 등록만 지원. 정적 등록(AndroidManifest에 receiver 선언)은 무효
- 같은 앱 내에서만 유효하며, 프로세스나 앱을 넘나들 수 없음
- 시스템 브로드캐스트와 함께 사용할 수 없음
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 로컬 브로드캐스트
Previous: 순서형 브로드캐스트