사용자 정의 브로드캐스트 전송

1. 사용자 정의 브로드캐스트 수신기 MyBroadcastReceiver.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "사용자 정의 브로드캐스트를 수신했습니다", Toast.LENGTH_LONG).show();
    }
}
Code language: JavaScript (javascript)

2. AndroidManifest.xml 수신기 등록 (매니페스트 파일)

<application> 태그 안에 추가:

<receiver
    android:name=".MyBroadcastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.foxdevelop.www.broadcastdemo.MY_BROADCAST" />
    </intent-filter>
</receiver>
Code language: HTML, XML (xml)

핵심: action 이름. 나중에 브로드캐스트 전송 시 사용하는 Intent 문자열은여기 내용과 완전히 동일해야 합니다

3. activity_main.xml 레이아웃 (버튼)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btn_send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="브로드캐스트 전송"/>
</LinearLayout>
Code language: HTML, XML (xml)

4. MainActivity.java 메인액티비티 (버튼 클릭 시 브로드캐스트 전송)

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = findViewById(R.id.btn_send);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // action 문자열은 매니페스트의 action과 완전히 같아야 함
                Intent intent = new Intent("cn.bamn.www.broadcastdemo.MY_BROADCAST");
                sendBroadcast(intent);
            }
        });
    }
}
Code language: JavaScript (javascript)

표준 브로드캐스트 vs 순서형 브로드캐스트

  1. 표준 브로드캐스트 sendBroadcast() 비동기 브로드캐스트. 모든 수신기가 거의 동시에 수신하며, 순서가 없고 중단할 수 없습니다.
  2. 순서형 브로드캐스트 sendOrderedBroadcast() 우선순위에 따라 순서대로 수신. 앞쪽 수신기는 abortBroadcast()로 브로드캐스트를 종료할 수 있으며 뒤쪽 수신기는 받지 못합니다.

이미지 속 오류: Activity class ...MainActivity does not exist

오류 의미: 시스템에서 MainActivity 클래스를 찾을 수 없습니다

흔한 원인

  1. AndroidManifest.xml 안의 Activity android:name 경로 오기 (가장 빈번)
    • 패키지명과 클래스명 불일치, 대소문자 오류
    • 작성 규칙: android:name=".MainActivity", .는 현재 application 패키지 하위를 의미
    • 확인 방법: IDE에서 Ctrl키를 누른 채 클래스명 클릭. MainActivity로 이동하면 경로가 정상
  2. 패키지명 불일치:build.gradle의 applicationId 와 매니페스트 package 이름이 다름
  3. 클래스 파일 누락:MainActivity.java 삭제 / 파일명 오류 (Java 클래스명은 파일명과 정확히 일치하며 대소문자 구분)
  4. 빌드 오류:프로젝트 컴파일 실패로 class 파일 생성 안됨; 프로젝트 클린 후 재빌드 (Build -> Clean Project)
  5. 대소문자 문제:Mainactivity 와 MainActivity는 서로 다른 클래스, Android는 대소문자를 구분합니다

간단한 문제 해결 절차

  1. AndroidManifest.xml을 열고 시작용 Activity 노드를 찾습니다<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
  2. Ctrl키를 누르고 .MainActivity를 클릭하여 코드 이동이 되는지 확인
  3. 이동 불가 → android:name을 올바른 완전 클래스명으로 수정
  4. 이동 가능 → Clean Project 실행 후 재빌드, apk 재설치

참고: 최신 Android(API26 이상) 주의사항:암시적 브로드캐스트 정적 등록에는 제약이 많습니다. 많은 시스템 암시적 브로드캐스트는 정적 등록이 불가하지만, 사용자 정의 action 암시적 브로드캐스트는 제한 없이 정상 동작합니다. 이 예제는 바로 실행할 수 있습니다.

사용자 정의 브로드캐스트 전송

답글 남기기

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