본문 바로가기
Android/Concepts

Device의 Network 상태 가져오기

by JuHy_ 2020. 5. 1.

앱을 개발하다보면 사용자가 인터넷에 연결된 상태인지 아닌지 확인해야 할 때가 있다.

 

예를 들어 넷플릭스나 유튜브를 보면 동영상을 저장하여 오프라인일 때 시청할 수 있는 기능을 제공한다.

인터넷이 가능할 때는 서버로부터 컨텐츠를 가져와 보여주고,

인터넷에 연결되지 않았을 때는 미리 저장된 컨텐츠를 보여주는 것이다.

 

이와 같은 기능을 구현하기 위해서는 인터넷 연결 상태를 미리 확인할 수 있는 방법이 필요하다.

 

Source Code

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

먼저 Manifest에 네트워크 상태를 확인할 수 있는 ACCESS_NETWORK_STATE 권한을 등록한다.

 

package com.juhy.myapplication;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class NetworkStatus {

    public static final int TYPE_WIFI = 1;
    public static final int TYPE_MOBILE = 2;
    public static final int TYPE_NOT_CONNECTED = 3;

    public static int getConnectivityStatus(Context context){
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        if (networkInfo != null) {
            int type = networkInfo.getType();
            if (type == ConnectivityManager.TYPE_MOBILE) {
                return TYPE_MOBILE;
            } else if (type == ConnectivityManager.TYPE_WIFI) {
                return TYPE_WIFI;
            }
        }

        return TYPE_NOT_CONNECTED;
    }

}

다음으로 네트워크 상태들을 저장한 변수와 네트워크 상태를 확인하는 메소드를 포함하는 클래스를 정의해보자.

네트워크 상태를 가져오는 메소드는 어디서든 호출하여 사용할 수 있도록 static으로 정의해주자.

 

먼저 context의 getSystemService() 메소드를 통해 ConnectivityManager를 가져온다.

그리고 ConnectivityManager 객체의 getActiveNetworkInfo() 함수를 통해 네트워크 상태를 가져온다.

마지막으로 네트워크 상태에 따라 미리 정한 변수를 반환하도록 하자.

 

int state = NetworkStatus.getConnectivityStatus(getApplicationContext());
switch (state){
    case NetworkStatus.TYPE_WIFI:
        tv_state.setText("WIFI");
        break;
    case NetworkStatus.TYPE_MOBILE:
        tv_state.setText("MOBILE");
        break;
    case NetworkStatus.TYPE_NOT_CONNECTED:
        tv_state.setText("NOT CONNECTED");
        break;
}

이제 네트워크 상태를 확인할 곳에서 NetworkStatus.getConnectivityStatus()를 호출하면 된다.

메소드를 통해 얻어온 상태를 switch문을 통해 분류하여 TextView에 띄워주었다.

 

 

와이파이 상태에서 앱 실행 후, 와이파이와 데이터를 차례대로 꺼보았다.

상태가 바뀔 때마다 정상적으로 상태를 가져와 띄워주는 것을 볼 수 있다.

 

※ 이 코드는 사용자의 Focus가 바뀔 때마다 상태를 확인하여 띄워주었다.

※ 네트워크의 상태가 바뀔 때 자동으로 띄워주게 하고 싶다면 BroadcastReceiver를 사용해야 한다.

 

 

Reference

[부스트코스]안드로이드 프로그래밍

https://www.edwith.org/boostcourse-android