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() 함수가 자동으로 호출 된다.
출처 : 깡샘의 안드로이드 프로그래밍 중에서
'프로그래밍 > Android' 카테고리의 다른 글
ERR_UNKNOWN_URL_SCHEME intent오류 해결방법 (2) | 2018.11.09 |
---|---|
SMS수신 처리 (0) | 2018.11.02 |
갤러리 앱 데이터 연동(ContentProvider) (0) | 2018.11.01 |
설치된 앱 목록 조회(PackageManager) (0) | 2018.10.31 |
Android 최상위 액티비티 확인 방법 (0) | 2018.10.31 |