본문 바로가기
프로그래밍/Android

ConnectivityManager 네트워크 접속 정보 얻기

by Mr-후 2018. 11. 2.
반응형


ConnectivityManager 네트워크 접속 정보 얻기



이제 조금씩 개념을 잡아가고 있는 안드로이드 학습. 거진 마지막 단계까지 다다르다. 그렇다 한들 실무에서는 버벅될 수 있으나, 아이폰이라고 다 알고 일을 해 온 것은 아니기때문에 개념과 용법을 알고 접근하는 것은 큰 차이가 있다고 생각이 된다. 

금주까지는 안드로이드 학습이 주업무지만 차주부터는 뭔가 생산성있는 개발을 하고 싶은데 잘 될지 의문이다. ㅋ 

운영 중인 앱에서 네트워크 상태 체크를 하지 않고 단지 3초간 기다렸다가 실패하면 메인으로 이동하게 해놓은 소스가 영 찜찜하던 차였는데 이번에 책을 보면서 알게된 네트워크 접속 정보를 가지고 사용자에게 알려줄 수 있는 패턴을 만들어서 적용할 예정이다. 




스마트폰의 네트워크 접속 정보 확인은 getActiveNetworkInfo() 함수를 통해 얻을 수 있다. 


ConnectivityManager connManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connManager.getActivityNetworkInfo(); 

if (networkInfo != null ) {

if (networkInfo.geType() == ConnectivityManager.TYPE_WIFI) {

// Wi-Fi일때 작업 

} else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) { 

// 3G, LTE... 

}

} else { 

//.... 네트워크가 불가능한 상태 

}


또 스마트폰의 네트워크 연결 상태가 바뀌는 순간 시스템은 브로드캐스트 리시버 인텐트를 발생시켜 알려 준다. 

IntentFilter intentfilter = new IntentFilter(); 
intentfilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(networkReceiver, intentfilter); 

네트워크 상태 정보를 얻을 수 있는 싱글턴으로 만들고 저 리시버에서 받은 상태 값을 업데이트 하는 식으로 하면 네트워크 상태에 따른 작업을 할 때 이용하면 될 것 같다. 

그런데 책에 보니 API Level 21(Android 5.0)에서  콜백을 이용해 감지하는 방법이 추가되었다고 한다. ㅠ.ㅠ 

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { 

NetworkRequest.Builder builder = new NetworkRequest.Builder(); 
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connectivityManager.registerNetworkCallback(builder.build(), networkCallback); 

}

흠.. .하위호환성 처리를 해야하는 상황이라 통합 관리해서 사용하기엔 좀 혼란스럽다. 그냥 싱글톤으로 상태를 업데이트 해서 공통으로 사용하는 것이 더 효율적이지 않을까 싶은데... 여튼, 

registerNetworkCallback()함수의 두 번째 매개변수가 콜백 객체이고, 이 객체는 NetwrokCallback을 구현한 객체이다. 

ConnectivityManager.networkCallback = networkCallback = new Connectivitymanager.NetworkCallback() {

@Override

public void onAvailable(Network network) {

NetworkInfo info = connectivityManager.getNetworkInfo(network);
String networkTypeName = info.getTypeName();
//....

}


@Overrid

public void onLost(Network network) {

//...

}

}; 

addTransportType() 함수로 등록한 타입의 네트워크만 사용 가능한 상황이 되면 onAvailable(), 불가능한 상황이 되면 onLost() 함수가 자동으로 호출 된다. 

출처 : 깡샘의 안드로이드 프로그래밍 중에서



반응형