Android 앱 간 브로드캐스트 수신

이 문서는 Android 4대 컴포넌트 중 하나인 브로드캐스트 리시버(BroadcastReceiver)를 사용한 앱 간 통신 예제입니다. 두 개의 독립된 프로젝트를 통해 App1이 커스텀 브로드캐스트를 보내고, App2가 이를 수신하는 과정을 보여줍니다.

1. 핵심 개념

Android 브로드캐스트는 시스템 수준의 메시지 발행/구독 메커니즘입니다:

  1. 브로드캐스트는 앱 간에 송수신할 수 있으며, 커스텀 브로드캐스트뿐만 아니라 시스템 브로드캐스트(부팅 완료, 배터리 변화, 화면 잠금 등)도 수신할 수 있습니다.
  2. 테스트 방법: 2개의 독립된 Android 프로젝트 생성
    • SendDemo: 커스텀 브로드캐스트를 보내는 송신 측 앱
    • SendDemo2: 브로드캐스트를 받는 수신 측 앱 (스크린샷에 나온 프로젝트)

2. 수신 측 코드 (SendDemo2)

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyBroadCastService extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 브로드캐스트 수신 시 콜백되어 Toast 표시
        Toast.makeText(context, "커스텀 브로드캐스트 22222를 수신했습니다", Toast.LENGTH_LONG).show();
    }
}
Code language: JavaScript (javascript)
  • BroadcastReceiver를 상속받고 onReceive()를 오버라이드해야 합니다. 브로드캐스트가 수신되면 이 메서드가 자동으로 실행됩니다.
  • 주의: onReceive에서는 시간이 오래 걸리는 작업을 하면 안 됩니다. 브로드캐스트의 수명주기가 매우 짧기 때문입니다.

3. 브로드캐스트 리시버 등록 (두 가지 방법)

방법 1: 정적 등록 (AndroidManifest.xml에 등록. 앱이 실행 중이지 않아도 수신 가능하지만, Android 8.0 이후로는 제한됨)
<receiver android:name=".MyBroadCastService">
    <intent-filter>
        <!-- 액션 식별자. 송신 측은 반드시 동일한 action 문자열을 사용해야 합니다 -->
        <action android:name="com.foxdevelop.MY_CUSTOM_BROADCAST"/>
    </intent-filter>
</receiver>
Code language: HTML, XML (xml)

송신 측 SendDemo가 브로드캐스트를 보낼 때 Intent의 action은 반드시 com.foxdevelop.MY_CUSTOM_BROADCAST로 지정해야 합니다. 양쪽의 action이 일치해야만 수신할 수 있습니다.

방법 2: 동적 등록 (코드에서 등록. 앱이 실행 중일 때만 수신 가능)
MyBroadCastService receiver = new MyBroadCastService();
IntentFilter filter = new IntentFilter("com.foxdevelop.MY_CUSTOM_BROADCAST");
registerReceiver(receiver, filter);
Code language: JavaScript (javascript)

4. 송신 측 SendDemo의 브로드캐스트 전송 코드

// 커스텀 앱 간 브로드캐스트 전송
Intent intent = new Intent("com.foxdevelop.MY_CUSTOM_BROADCAST");
sendBroadcast(intent);
Code language: JavaScript (javascript)

5. 주의사항

  1. Android 8.0 (API 26) 이후: 정적 등록된 커스텀 암시적 브로드캐스트는 제한을 받습니다. 많은 커스텀 action이 정적 등록으로는 수신되지 않습니다.
    • 해결책: ① 동적 등록 사용; ② 브로드캐스트 전송 시 패키지명을 포함한 명시적 Intent 사용.
  2. 시스템 브로드캐스트(네트워크 변경, 배터리 등)는 대부분 정상적으로 수신 가능하지만, 일부 시스템 브로드캐스트에도 제한이 있습니다.
  3. 앱 간 브로드캐스트에는 보안 위험이 있으므로, 권한을 설정해 송수신을 제어할 수 있습니다.

6. 실행 흐름

  1. SendDemo(송신 측)와 SendDemo2(수신 측) 두 앱을 동일한 기기/에뮬레이터에 설치합니다.
  2. SendDemo에서 버튼을 누르면 sendBroadcast를 호출하여 action이 com.foxdevelop.MY_CUSTOM_BROADCAST인 브로드캐스트를 전송합니다.
  3. 시스템이 브로드캐스트를 디스패치하면, 해당 action에 등록된 모든 BroadcastReceiver(SendDemo2 내의 MyBroadCastService)의 onReceive가 트리거됩니다.
  4. SendDemo2에 Toast가 표시됩니다: 커스텀 브로드캐스트 22222를 수신했습니다

Android 앱 간 브로드캐스트 수신

답글 남기기

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