본문 바로가기
android/kotlin

[Android][Kotlin] 네트워크 연결상태 체크하기

by 윈 Win 2021. 6. 4.
728x90

블로그 이사했습니다!

 

👇 블로그 이전 공지 👇

블로그 이전 안내 (tistory.com)

 

 

👇 새 블로그에서 글 보기 👇

[Android] 네트워크 연결상태 체크하기 — Win Record (tistory.com)

 

 

 


 

구현 기능

  • 앱 시작 시, 네트워크 연결 안 되어있으면 다이얼로그 띄우기
  • 네트워크 끊어졌을 경우 다이얼로그 띄우기
  • 네트워크 연결됬을 경우 다이얼로그 사라지게 하기

구현 순서

  1. 네트워크 클래스 만들기
  2. 액티비티에 네트워크 객체 생성하기

 


 

네트워크 클래스, NetworkConnection 만들기

1. 네트워크 변경 감지

네트워크 변경을 감지하기 위한 NetworkCallback을 구현한다.

NetworkCallback은 사용에 앞서 반드시 등록 및 해제를 해주어야 한다.

    등록 시 아래 메소드 중 하나를 사용하면 된다.

  • requestNetwork(NetworkRequest, NetworkCallback)
  • registerNetworkCallback(NetworkRequest, NetworkCallback)
  • registerDefaultNetworkCallback(NetworkRequest, NetworkCallback)

    해제 시 unregisterNetworkCallback(NetworkCallback)를 사용한다.

등록과 해제를 위한 매개변수인 NetworkRequest를 구현해야 한다. 이때 모바일데이터와 와이파이 네트워크를 감지하기 위해 addTransportType() 메소드를 사용해 NetworkRequest를 빌드한다.

 

2. 현재 네트워크 상태 확인

지금 당장의 어떤 네트워크에 연결되어 있는지 알기 위해 ConnectivityManager의 getActiveNetwork()를 사용한다.

 

package com.example.networkconnection

import android.app.AlertDialog
import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest

// 네트워크 연결 확인을 위해 네트워크 변경 시 알람에 사용하는 클래스 NetworkCallback 을 커스터마이징
class NetworkConnection(private val context: Context) :
    ConnectivityManager.NetworkCallback() {

    private val connectivityManager: ConnectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    private val networkRequest: NetworkRequest = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) // 데이터 사용 관련 감지
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // 와이파이 사용 관련 감지
        .build()

    // 네트워크 연결 안 되어있을 때 보여줄 다이얼로그
    private val dialog: AlertDialog by lazy {
        AlertDialog.Builder(context)
            .setTitle("네트워크 연결 안 됨")
            .setMessage("와이파이 또는 모바일 데이터를 확인해주세요")
            .create()
    }

    // NetworkCallback 등록
    fun register() {
        connectivityManager.registerNetworkCallback(networkRequest, this)
    }

    // NetworkCallback 해제
    fun unregister() {
        connectivityManager.unregisterNetworkCallback(this)
    }

    // 현재 네트워크 상태 확인
    fun getConnectivityStatus(): Network? {
        // 연결된 네트워크가 없을 시 null 리턴
        return connectivityManager.activeNetwork
    }

    // 콜백이 등록되거나 네트워크가 연결되었을 때 실행되는 메소드
    override fun onAvailable(network: Network) {
        super.onAvailable(network)

        if (getConnectivityStatus() == null) {
            // 네트워크 연결 안 되어 있을 때
            dialog.show()
        } else {
            // 네트워크 연결 되어 있을 때
            dialog.dismiss()
        }
    }

    // 네트워크 끊겼을 때 실행되는 메소드
    override fun onLost(network: Network) {
        super.onLost(network)
        dialog.show()
    }
}

 

액티비티에서 네트워크 객체 등록 및 해제하기

필요한 곳에서 네트워크 객체를 생성하고 등록과 해제를 세팅해준다.

package com.example.networkconnection

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {
    private val networkCheck: NetworkConnection by lazy {
        NetworkConnection(this)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        networkCheck.register() // 네트워크 객체 등록
    }

    override fun onDestroy() {
        super.onDestroy()
        
        networkCheck.unregister() // 네트워크 객체 해제
    }
}

댓글