이 튜토리얼에서는 Kotlin을 사용해 안드로이드 앱에서 브로드캐스트 리시버(Broadcast Receiver)를 프로그래밍 방식(코드)으로 등록하는 방법을 단계별로 알아봅니다. 예제에서는 네트워크 연결 상태 변화를 감지하는 리시버를 구현합니다.
1단계: 새 프로젝트 생성
Android Studio를 실행하고 File → New Project 메뉴로 이동한 후, 필요한 모든 정보를 입력하여 새 프로젝트를 생성합니다.
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:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:text="Tutorials Point"
android:textAlignment="center"
android:textColor="@android:color/holo_green_dark"
android:textSize="32sp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="BroadCastReceiver"
android:textColor="@android:color/holo_blue_dark"
android:textSize="24sp" />
</RelativeLayout>3단계: MainActivity.kt 작성
src/MainActivity.kt 파일에 아래 코드를 추가합니다. 핵심은 onStart()에서 registerReceiver()로 리시버를 등록하고, onStop()에서 unregisterReceiver()로 해제하는 것입니다.
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.ConnectivityManager
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private val myBroadCastReceiver: BroadcastReceiver = MyBroadCastReceiver()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
}
override fun onStart() {
super.onStart()
val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
registerReceiver(myBroadCastReceiver, filter)
}
override fun onStop() {
super.onStop()
unregisterReceiver(myBroadCastReceiver)
}
}
class MyBroadCastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (ConnectivityManager.CONNECTIVITY_ACTION == intent!!.action) {
val noConnectivity: Boolean = 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()
}
}
}
}4단계: 매니페스트 설정
androidManifest.xml 파일에 아래 코드를 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="com.example.q11">
<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(실행) 아이콘을 클릭하세요. 목록에서 자신의 모바일 기기를 선택하면 기기 화면에 앱이 실행됩니다.
앱이 실행된 상태에서 기기의 네트워크(Wi-Fi 또는 모바일 데이터)를 켜거나 끄면, 연결 상태가 변경될 때마다 "Connected"(연결됨) 또는 "Disconnected"(연결 해제됨) 토스트 메시지가 화면에 표시되는 것을 확인할 수 있습니다.
참고 사항
CONNECTIVITY_ACTION은 API 24부터 사용이 중단(deprecated)되었으며, Android 7.0 이상에서는 백그라운드 등록 시 동작하지 않습니다. 최신 버전을 대상으로 한다면 NetworkCallback(ConnectivityManager) 사용을 권장합니다. 다만, 동적 리시버 등록과 해제의 기본 흐름을 이해하기 위한 예제로는 여전히 유용합니다.