개요
이 튜토리얼에서는 BroadcastReceiver를 활용해 안드로이드 앱에서 인터넷 연결 상태(Wi-Fi, 모바일 데이터, 연결 없음)를 실시간으로 확인하는 방법을 단계별로 살펴봅니다.
1단계 – 새 프로젝트 생성
Android Studio에서 File → New Project를 선택하고, 필요한 정보를 모두 입력해 새 프로젝트를 생성합니다.
2단계 – 네트워크 상태 권한 추가
인터넷 연결 상태를 확인하려면 먼저 AndroidManifest.xml 파일에 네트워크 상태 접근 권한(ACCESS_NETWORK_STATE)을 선언해야 합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.andy.myapplication">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<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>3단계 – MainActivity 구현
수정된 메인 액티비티 파일(MainActivity.java)의 내용입니다. 이 파일에는 기본적인 라이프사이클 메서드가 포함됩니다. 화면에 TextView를 하나 만들고, 사용자가 이 TextView를 클릭하면 broadcastIntent() 메서드가 호출되어 CONNECTIVITY_ACTION 인텐트를 브로드캐스트합니다.
import android.content.BroadcastReceiver;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private BroadcastReceiver MyReceiver = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyReceiver = new MyReceiver();
TextView click = findViewById(R.id.click);
click.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
broadcastIntent();
}
});
}
public void broadcastIntent() {
registerReceiver(MyReceiver,
new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(MyReceiver);
}
}4단계 – NetworkUtil 클래스 작성
네트워크 상태를 판별하기 위한 유틸리티 클래스입니다. 현재 활성화된 네트워크가 Wi-Fi인지, 모바일 데이터인지, 아니면 연결이 없는지를 문자열로 반환합니다.
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
class NetworkUtil {
public static String getConnectivityStatusString(Context context) {
String status = null;
ConnectivityManager cm =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (activeNetwork != null) {
if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
status = "Wifi enabled";
return status;
} else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
status = "Mobile data enabled";
return status;
}
} else {
status = "No internet is available";
return status;
}
return status;
}
}5단계 – BroadcastReceiver 클래스 작성
MyReceiver.java라는 이름의 브로드캐스트 리시버 클래스를 생성합니다. 이 리시버는 네트워크 변경 이벤트를 수신하면 NetworkUtil 클래스의 결과를 받아 UI(Toast)에 갱신해 줍니다.
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String status = NetworkUtil.getConnectivityStatusString(context);
if (status.isEmpty()) {
status = "No Internet Connection";
}
Toast.makeText(context, status, Toast.LENGTH_LONG).show();
}
}6단계 – 매니페스트에 리시버 등록
브로드캐스트 리시버가 시스템의 네트워크 변경 이벤트를 받을 수 있도록 매니페스트 파일에 아래와 같이 등록합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.andy.myapplication">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<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>
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
</application>
</manifest>7단계 – 레이아웃 파일 작성
res/layout/activity_main.xml 파일에는 클릭 시 연결 상태 확인 인텐트를 발생시키는 TextView를 배치합니다.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click here"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기를 컴퓨터에 연결한 상태라고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 아이콘을 클릭하세요. 실행할 기기 목록에서 자신의 모바일 기기를 선택하면, 기기 화면에 기본 화면이 표시됩니다.
Wi-Fi에 연결된 상태에서 TextView를 클릭하면 다음과 같이 현재 연결 상태가 Toast 메시지로 표시됩니다.

모바일 데이터나 연결 없음 상태에서도 동일하게 클릭하면, 각각 "Mobile data enabled", "No internet is available"과 같은 결과가 화면에 나타납니다.



참고: 최신 Android 버전에서의 주의사항
위 예제에서 사용한 CONNECTIVITY_ACTION 브로드캐스트는 API 24(Nougat)부터 백그라운드 제한 대상이 되었고, API 28부터 공식적으로 지원 중단(deprecated)되었습니다. 또한 NetworkInfo 역시 API 29부터 지원 중단되었습니다.
따라서 최신 버전(Android 7.0 이상)을 대상으로 하는 앱이라면, 브로드캐스트 방식 대신 ConnectivityManager.NetworkCallback을 사용해 네트워크 변화를 감지하는 것이 권장됩니다. 다만 이 글의 예제는 브로드캐스트 리시버의 기본 개념과 네트워크 상태 확인 흐름을 학습하기에 여전히 유용한 참고 자료입니다.