안드로이드

안드로이드 네트워크 연결상태 체크 ConnectivityManager.NetworkCallback 사용법

알통몬_ 2019. 11. 26. 12:14
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


안드로이드에서 네트워크 상태체크를 할 때 

많이 사용하던 클래스가 있다.

public static boolean checkNetworkStatus(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected());
}


하지만 코틀린에서 해당 코드를 사용하면,

api29부터 자바에서 Deprecated

되었다는 warning이 뜨고 줄이 그어진다 아래처럼

위 코드의 치명적 단점은 실시간으로 체크할 수 없다는 것이다.

해당 시점, 즉. 해당 코드가 호출되는 시점에서만 체크가 된다.

때문에 중간에 연결이 끊기는 경우는 체크하지 못한다.


해당 문제 해결을 위해 BroadcastReceiver를 

사용하는 예제는 구글에 많이 존재하고 있지만 이마저도 

api가 올라감에 따라 BroadCastReceiver의

제약이 많아져서 사용하기 까다롭다.


그래서  안드로이드 문서에서 추천하는 방법인 

ConnectivityManager.NetworkCallback 클래스를 사용해

네트워크 연결체크 기능을 만들어보았습니다.

저는 요즘 왠만하면 코틀린으로 개발해보려 합니다. 

하지만 코틀린을 모르는 분이

이 글을 볼 수도 있으니 코틀린과 자바, 두 언어로 만들어봤습니다.


Kotiln

package com.sunggyun.networkcheck

import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import android.widget.Toast

class NetworkConnectionStateMonitor(context: Context) : ConnectivityManager.NetworkCallback() {

private var context : Context? = null
private var networkRequest: NetworkRequest? = null
private var connectivityManager : ConnectivityManager? = null

init {
this.context = context
this.networkRequest =
NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build()
}

fun register() {
connectivityManager = context!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager!!.registerNetworkCallback(networkRequest!!, this)
}

fun unregister() {
connectivityManager!!.unregisterNetworkCallback(this)
}

override fun onAvailable(network: Network) {
super.onAvailable(network)
// Do what you need to do here
// 네트워크가 연결되었을 때 할 동작
Toast.makeText(this.context, "network available", Toast.LENGTH_SHORT).show()
}

override fun onLost(network: Network) {
super.onLost(network)
// Do what you need to do here
// 네트워크 연결이 끊겼을 때 할 동작
Toast.makeText(this.context, "network lost", Toast.LENGTH_SHORT).show()
}
}


Java

package com.sunggyun.networkcheck;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

public class NetworkConnectionStateMoniterJava extends ConnectivityManager.NetworkCallback {

private Context context;
private NetworkRequest networkRequest;
private ConnectivityManager connectivityManager;

public NetworkConnectionStateMoniterJava(Context context) {
this.context = context;
networkRequest =
new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build();
this.connectivityManager = (ConnectivityManager) this.context.getSystemService(Context.CONNECTIVITY_SERVICE);
}

public void register() {
this.connectivityManager.registerNetworkCallback(networkRequest, this);
}

public void unregister() {
this.connectivityManager.unregisterNetworkCallback(this);
}

@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
// Do what you need to do here
// 네트워크가 연결되었을 때 할 동작
Toast.makeText(this.context, "network available", Toast.LENGTH_SHORT).show()
}

@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
// Do what you need to do here
// 네트워크 연결이 끊겼을 때 할 동작
Toast.makeText(this.context, "network lost", Toast.LENGTH_SHORT).show()
}
}


사용법은 둘 다 같습니다.

Activity의

onCreate() 에서 등록하고

networkConnectionStateMonitor = NetworkConnectionStateMonitor(this)
networkConnectionStateMonitor.register()


onDestroy() 에서 등록해제하면 됩니다.

override fun onDestroy() {
super.onDestroy()
networkConnectionStateMonitor.unregister()
}


만약 모든 액티비티에서 하고 싶다면 부모 Activity를 만들고

부모 Activity의 onCreate()에서 등록, 

onDestroy()에서 해제하도록 하고

다른 Activity들에서 부모 Activity를 상속받으면 되겠죠?


참고로 AndroidManifest.xml 에 아래 두 퍼미션이 필요합니다.

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

이상입니다.

전체 소스는 깃허브에 공유했습니다.

https://github.com/Parksunggyun/NetworkCheck

반응형