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 순서형 브로드캐스트
- 표준 브로드캐스트 sendBroadcast() 비동기 브로드캐스트. 모든 수신기가 거의 동시에 수신하며, 순서가 없고 중단할 수 없습니다.
- 순서형 브로드캐스트 sendOrderedBroadcast() 우선순위에 따라 순서대로 수신. 앞쪽 수신기는
abortBroadcast()로 브로드캐스트를 종료할 수 있으며 뒤쪽 수신기는 받지 못합니다.
이미지 속 오류: Activity class ...MainActivity does not exist
오류 의미: 시스템에서 MainActivity 클래스를 찾을 수 없습니다
흔한 원인
- AndroidManifest.xml 안의 Activity
android:name경로 오기 (가장 빈번)- 패키지명과 클래스명 불일치, 대소문자 오류
- 작성 규칙:
android:name=".MainActivity",.는 현재 application 패키지 하위를 의미 - 확인 방법: IDE에서 Ctrl키를 누른 채 클래스명 클릭. MainActivity로 이동하면 경로가 정상
- 패키지명 불일치:build.gradle의 applicationId 와 매니페스트 package 이름이 다름
- 클래스 파일 누락:MainActivity.java 삭제 / 파일명 오류 (Java 클래스명은 파일명과 정확히 일치하며 대소문자 구분)
- 빌드 오류:프로젝트 컴파일 실패로 class 파일 생성 안됨; 프로젝트 클린 후 재빌드 (Build -> Clean Project)
- 대소문자 문제:
Mainactivity와MainActivity는 서로 다른 클래스, Android는 대소문자를 구분합니다
간단한 문제 해결 절차
- 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> - Ctrl키를 누르고
.MainActivity를 클릭하여 코드 이동이 되는지 확인 - 이동 불가 →
android:name을 올바른 완전 클래스명으로 수정 - 이동 가능 →
Clean Project실행 후 재빌드, apk 재설치
참고: 최신 Android(API26 이상) 주의사항:암시적 브로드캐스트 정적 등록에는 제약이 많습니다. 많은 시스템 암시적 브로드캐스트는 정적 등록이 불가하지만, 사용자 정의 action 암시적 브로드캐스트는 제한 없이 정상 동작합니다. 이 예제는 바로 실행할 수 있습니다.
사용자 정의 브로드캐스트 전송
Previous: 정적 등록 방식을 이용한 부팅 알림 구현
Next: Android 앱 간 브로드캐스트 수신