본문 바로가기

소프트웨어/Android/Java/Ndk

Android] Wifi 연결상태 변경 체크(브로드케스트리시버)

프로젝트를 진행하면서 계획중에 연결중인 Wifi AP 범위를 벗어나면 자동으로 앱을 종료시켜주는 사항이 있었다.


처음에는 이 부분을 제공하기 위해서 Service를 BackGround에 등록한 후 매번 Wifi모듈의 상태를 확인하는 쓰레드 루틴을 작성하였다. 그러나 앱이 비정상 종료 되었을 때 서비스에서 생성된 Thread를 종료시킬 방법이 없어서 계속해서 Notification을 하는 좀비앱이 되는 문제가 발생하였다. 그래서 더 나은 방법을 찾던 중 BroadCastReceiver라는 정보를 얻게되었다.


BroadcastReceiver를 사용하기 위해서는 BroadcastReceiver를 상속받아야 한다. 

...(여러 잡다한 부분은 중략)...


그 후 Broadcastreceiver를 상속받은 클래스의 onReceive매서드에서

public void onReceive(Context context, Intent intent)

{

  if (m_OnChangeNetworkStatusListener == null)

  {

return;

  }


  String strAction = intent.getAction();

NetworkInfo networkInfo = m_ConnManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

 if (strAction.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {

if (networkInfo.getState() == NetworkInfo.State.CONNECTED)

{

m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_CONNECTED);

}

else if (networkInfo.getState() == NetworkInfo.State.DISCONNECTED)

{

m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_DISCONNECTED);

}

}


}


와 같이 WifiManager의 NETWORK_STATE_CHANGED_ACTION  의 변화를 확인하면된다.



사용하고자 하는 Activity에서는 아래와같이 리시버를 등록한다. (WifiMonitor는 BroadcastReceiver를 상속받은 클래스이다)


    WifiMonitor mWifiMonitor = new WifiMonitor(this);

IntentFilter receiverFilter = new IntentFilter();

receiverFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);

receiverFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);

registerReceiver(mWifiMonitor, receiverFilter);


리시버 클래스를 생성한 후 BroadcastReceiver를 사용하기위한 IntentFilter를 설정해준 후  registerReceiver(리시버클래스, 필터); 매서드를 이용해서 등록한다.



동작은 아래와 같고 리시버 클래스 첨부

(Wifi가 연결되면서 Connecting -> connected 순으로 토스트가 출력되는 모습)

WifiMonitor.java