Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드에서 코드로 BroadcastReceiver를 동적으로 등록하는 방법

안드로이드 BroadcastReceiver 프로그래밍 방식 등록 개요

이 튜토리얼에서는 안드로이드 앱에서 BroadcastReceiver를 AndroidManifest.xml에 선언하지 않고, 자바 코드로 직접 등록하고 해제하는 동적(Dynamic) 등록 방법을 단계별로 알아봅니다. 이 예제에서는 네트워크 연결 상태 변화를 감지하여 화면에 토스트 메시지를 표시하는 리시버를 구현합니다.

코드로 리시버를 등록하면 특정 화면(Activity)이 활성화되어 있는 동안에만 브로드캐스트를 수신할 수 있어, 불필요한 배터리 소모를 줄이고 컴포넌트 생명주기에 맞춰 리소스를 관리할 수 있다는 장점이 있습니다.

1단계 — 새 프로젝트 생성

Android Studio에서 File → New Project를 선택한 후, 빈 프로젝트(Empty Activity) 템플릿을 고르고 필요한 정보를 모두 입력해 새 프로젝트를 생성합니다.

2단계 — 레이아웃 파일 작성

다음 코드를 res/layout/activity_main.xml에 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World"
        android:layout_centerInParent="true"/>
</RelativeLayout>

레이아웃은 화면 중앙에 간단한 텍스트뷰 하나만 배치하는 구성입니다. 이 예제의 핵심은 UI가 아니라 리시버 등록 로직에 있습니다.

3단계 — MainActivity에 리시버 등록/해제 코드 추가

다음 코드를 src/MainActivity.java에 작성합니다.

import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    ExampleBroadcastReceiver exampleBroadcastReceiver = new ExampleBroadcastReceiver();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    protected void onStart() {
        super.onStart();
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(exampleBroadcastReceiver, filter);
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(exampleBroadcastReceiver);
    }
}

핵심 포인트는 다음과 같습니다.

  • onStart(): 액티비티가 화면에 보이기 시작할 때 registerReceiver()를 호출하여 리시버를 등록합니다. IntentFilterCONNECTIVITY_ACTION을 지정해 네트워크 상태 변경 브로드캐스트만 수신하도록 설정했습니다.
  • onStop(): 액티비티가 더 이상 보이지 않을 때 unregisterReceiver()를 호출하여 반드시 리시버를 해제합니다. 등록된 리시버를 해제하지 않으면 메모리 누수가 발생할 수 있습니다.

4단계 — BroadcastReceiver 클래스 작성

새 자바 클래스를 만들고 다음 코드를 ExampleBroadcastReceiver.java에 작성합니다.

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

class ExampleBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
            boolean noConnectivity = intent.getBooleanExtra(
                    ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
            if (noConnectivity) {
                Toast.makeText(context, "Disconnected", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "Connected", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

onReceive() 콜백에서 수신된 인텐트의 액션이 연결 상태 변경인지 확인한 뒤, EXTRA_NO_CONNECTIVITY 엑스트라 값을 읽어 연결 끊김 여부를 판단합니다. 결과에 따라 "Connected"(연결됨) 또는 "Disconnected"(연결 끊김) 토스트를 화면에 표시합니다.

5단계 — AndroidManifest.xml 확인

다음 코드를 androidManifest.xml에 작성합니다. 동적으로 등록하는 경우 매니페스트에 <receiver> 태그를 별도로 선언할 필요가 없습니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

앱 실행 및 결과 확인

실제 안드로이드 기기를 컴퓨터에 연결한 상태에서 앱을 실행해 보겠습니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run 아이콘을 클릭하고, 목록에서 자신의 모바일 기기를 선택합니다. 그러면 기기에 다음과 같은 기본 화면이 표시됩니다.

안드로이드에서 코드로 BroadcastReceiver를 동적으로 등록하는 방법

안드로이드에서 코드로 BroadcastReceiver를 동적으로 등록하는 방법

이제 기기의 Wi-Fi나 모바일 데이터를 켜거나 꺼서 네트워크 상태를 변경해 보세요. 상태가 바뀔 때마다 리시버가 브로드캐스트를 수신하여 화면에 토스트 메시지가 나타나는 것을 확인할 수 있습니다.

참고: 최신 API에서의 주의사항

ConnectivityManager.CONNECTIVITY_ACTIONAPI 24부터 사용이 중단(deprecated)되었으며, Android 7.0(Nougat) 이상에서는 앱이 백그라운드에 있을 때 해당 브로드캐스트를 수신하지 못합니다. 최신 버전을 대상으로 개발한다면 NetworkCallback(ConnectivityManager.registerNetworkCallback())을 사용하는 것이 권장됩니다. 하지만 동적 리시버 등록/해제 패턴 자체는 다른 많은 시스템·커스텀 브로드캐스트에도 동일하게 적용할 수 있는 핵심 개념입니다.