본문 바로가기
Development/Android

[안드로이드] BroadcastReceiver를 이용한 Network 연결상태 확인!

by 푸민 2015. 9. 4.
반응형


안녕하세요 푸민입니다.

안드로이드에서 네트워크 관련 프로그래밍을 하다보면 항상 문제가 되는 것이 있습니다.

그것은.. 바로!! 인터넷 연결...


모바일의 특성상 웹과는 다르게 인터넷이 연결이 될수있고, 안될수있고, 신호가 약할수 있고 쌜수도 있고, 와이파이에 연결될수도 있고.... 다양한 상황이 생길수 있습니다. 이런 상황들을 잘 처리해준다면 더욱 안정적인 앱을 만들수 있습니다.


자 그러면 어떻게 체크를 할 수 있을까요? 우리는 직접 체크를 못합니다. 하지만 안드로이드 기기에서는 자기가 직접 확인을 할 수 있지요! 그렇다면 어떻게 안드로이드와 커뮤니케이션을 할 수 있을까요??


안드로이드에서는 BroadcastReceiver 라는 클래스를 제공해줍니다. 얘는 이름 그대로 여러가지 신호를 받아주는 클래스입니다. 그러면 한번 볼까요?


 코드 

ConnectivityManager connectivityManager(ConnectivityManager)mContext

.getSystemService(Context.CONNECTIVITY_SERVICE);


private BroadcastReceiver receiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)){

if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null){

if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()){

                        //

}

}

if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null){

if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected()){

                        //

}

}

}

}

};


 설명 

BroadcastReceiver 객체를 만듭니다.  그리고 onReceive() 메소드를 오버라이딩합니다! onReceive() 는 안드로이드 단말기가 각종 상황에 대해서 알려주는 메소드입니다. 먼저 해야될 것은 해당 인텐트의 액션이 무엇인지 확인하는 것입니다. 즉, 이 리시버가 네트워크 상황에 관련해서 불린것인지, 아니면 배터리가 부족하여 불리는 것인지 같은 상태를 먼저 체크하는 것입니다. 왜냐하면 여러가지 필터를 적용하여 onReceive() 가 여러 상황에서 불리기 때문입니다.


자 그럼 두번째로 체크할 것은 각종 네트워크의 연결 상태를 확인하는 것입니다. onReceive() 는 네트워크의 상태가 바뀌면 계속 불리거든요. 그래서 현재 상태는 ConnectivityManager 를 이용해서 알아볼수 있는데요. ConnectivityManager getNetworkInfo() 를 통해서 각 네트워크별로 상태를 들고 올수 있습니다. 위와 같이 ConnectivityManager.TYPE_WIFI 를 이용해 WiFi 정보를 불러올수 있구요, ConnectivityManager.TYPE_MOBILE 을 이용해서 모바일 네트워크 정보도 불러올 수 있습니다. 참고로 Null 값이 반환된다면 그것은 해당 네트워크를 지원 안하는 것입니다. 예를 들면 WIFI 전용 태블릿에서 MOBILE 네트워크를 달라고하면 Null 이 반환되는 것이죠.


마지막으로 isConnected() 를 이용하여 연결이 되있는지 체크합니다. 그리고 네트워크 상태에 따라서 작업을 해주시면 됩니다!!



참 중요한 것이 있는데요. 해당 리시버를 만들기만 하면 안되고 등록을 해줘야 되요.


 코드 

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);

 

mContext.registerReceiver(receiver, filter);

mContext.unregisterReceiver(receiver);


 설명 

등록은 Context 객체가 가지고 있는데요. registerReceiver() 로 등록할 수 있습니다. 그리고 unregisterReceiver() 를 이용해서 반드시 해제를 해줘야해요! 안해주면 자기도 모르게 백그라운드에서 동작을 하고 있을 거에요 ㅎㅎ

반응형

댓글