Android

안드로이드 네트워크 연결 상태 확인

easy-1 2021. 12. 11. 19:21

<개요>

앱 개발을 하다보면 네트워크 연결 상태에 대한 처리가 필요하다

여기서는 네트워크 연결 상태 확인 클래스를 만들어 액티비티에서 상속하여 사용해보도록 하자


<적용방법>

1. 네트워크 연결 상태에 대한 인터페이스를 생성

interface NetworkListener {
    fun networkConnected()  // 연결됨
    fun networkFailed()     // 연결실패
}

2. 네트워크 연결 상태 확인하는 클래스 생성

class NetworkInfo(
    private val activity: Activity,
    private val networkListener: NetworkListener
) : ConnectivityManager.NetworkCallback() {


    // 네트워크가 연결될 때 호출
    override fun onAvailable(network: Network) {
        networkListener.networkConnected()
    }

    // 네트워크가 끊길 때 호출
    override fun onLost(network: Network) {
        networkListener.networkFailed()
    }

    // 콜백을 등록하는 함수
    fun registerNetworkCallback() {
        // 네트워크 연결 상태 확인
        val connectivityManager = activity.getSystemService(ConnectivityManager::class.java)
        val networkRequest = NetworkRequest.Builder()
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)     // 와이파이
            .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) // 셀룰러 데이터
            .build()
        connectivityManager.registerNetworkCallback(networkRequest, this) // 등록
    }

    // 콜백을 해제하는 함수
    fun terminateNetworkCallback() {
        val connectivityManager = activity.getSystemService(ConnectivityManager::class.java)
        connectivityManager.unregisterNetworkCallback(this) // 해제
    }
}

3. 액티비티에서 상속 및 콜백 등록, 해제 진행

- onReume() 시에 콜백 등록해주고 onStop()시에 콜백해제해줌

- 여기서는 BaseActivity 에서 연결해서 사용

abstract class BaseActivity<B : ViewDataBinding, R : ViewModel>(
    @LayoutRes val layoutId: Int
) : AppCompatActivity(), NetworkListener {

    lateinit var binding: B   // Binding
    abstract val viewModel: R // ViewModel
    private lateinit var networkInfo: NetworkInfo // 네트워크 연결 상태 클래스

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, layoutId)
        binding.lifecycleOwner = this
        networkInfo = NetworkInfo(this, this) // init
    }

    /**
     * 네트워크 연결 상태 확인
     */
    override fun onResume() {
        super.onResume()
        // 콜백등록
        networkInfo.registerNetworkCallback()
    }

    override fun onStop() {
        super.onStop()
        // 콜백해제
        networkInfo.terminateNetworkCallback()
    }

    // 네트워크 연결됨
    override fun networkConnected() {
        Dlog.d("네트워크 연결됨")
    }

    // 네트워크 연결끊김
    override fun networkFailed() {
        Dlog.d("네트워크 끊김")
    }
}

 

이렇게 액티비티에 네트워크 연결 상태를 처리해 줄 수 있다