네트워크 상태 변화 감지하기(BroadcastReceiver 사용)

by 조쉬 posted Jul 16, 2015
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

개발을 하다보면 특정 어플의 목적에 따라 와이파이(Wi-Fi)의 상태를 감지해야 할 경우가 있습니다.
그것도 실시간으로 !!!

단순히 어플 시작할 때라던가, 특정 버튼을 눌렀을 때 와이파이의 상태를 체크하는 방법은 간단합니다.
 

01.private boolean isWifiConnected()
02.{
03.    ConnectivityManager connMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
04.    if (connMgr != null)
05.    {
06.        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
07.        if ( (networkInfo != null) && (networkInfo.isAvailable() == true) )
08.        {
09.            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI)
10.            {
11.                if ( (networkInfo.getState() == State.CONNECTED)
12.                        || (networkInfo.getState() == State.CONNECTING) )
13.                {
14.                    return true;
15.                }
16.            }
17.        }
18.    }
19.     
20.    return false;
21.}


위와 같이 특정 상태에서 와이파이의 연결 상태를 측정할 수 있습니다.


하지만, 이 방식은 위의 저 함수가 호출되었을 때만 값을 불러올 수 있다는 단점이 있습니다.
실시간으로 와이파이 상태가 바뀌는 것을 감지할 수 없다는 것이죠.


그래서, 네트워크 상태를 실시간으로 체크하기 위해서 SnowWiFiMonitor 라는 클래스를 한 번 만들어 보겠습니다.
안드로이드 운영체제로부터 상태 변화 메세지를 받기 위해서는 BroadcastReceiver를 상속 받습니다.

코드는 대략 다음과 같습니다.
 

001.package snowdeer.wifi.monitor;
002. 
003.import android.content.BroadcastReceiver;
004.import android.content.Context;
005.import android.content.Intent;
006.import android.net.ConnectivityManager;
007.import android.net.NetworkInfo;
008.import android.net.wifi.WifiManager;
009. 
010.public class SnowWiFiMonitor extends BroadcastReceiver
011.{
012.    public final static int WIFI_STATE_DISABLED         = 0x00;
013.    public final static int WIFI_STATE_DISABLING        = WIFI_STATE_DISABLED       + 1;
014.    public final static int WIFI_STATE_ENABLED          = WIFI_STATE_DISABLING      + 1;
015.    public final static int WIFI_STATE_ENABLING         = WIFI_STATE_ENABLED        + 1;
016.    public final static int WIFI_STATE_UNKNOWN          = WIFI_STATE_ENABLING       + 1;
017.    public final static int NETWORK_STATE_CONNECTED     = WIFI_STATE_UNKNOWN        + 1;
018.    public final static int NETWORK_STATE_CONNECTING    = NETWORK_STATE_CONNECTED   + 1;
019.    public final static int NETWORK_STATE_DISCONNECTED  = NETWORK_STATE_CONNECTING  + 1;
020.    public final static int NETWORK_STATE_DISCONNECTING = NETWORK_STATE_DISCONNECTED + 1;
021.    public final static int NETWORK_STATE_SUSPENDED     = NETWORK_STATE_DISCONNECTING + 1;
022.    public final static int NETWORK_STATE_UNKNOWN       = NETWORK_STATE_SUSPENDED   + 1;
023.     
024.    public interface OnChangeNetworkStatusListener
025.    {
026.        public void OnChanged(int status);
027.    }
028.     
029.    private WifiManager         m_WifiManager = null;
030.    private ConnectivityManager m_ConnManager = null;
031.    private OnChangeNetworkStatusListener m_OnChangeNetworkStatusListener = null;
032.     
033.    public SnowWiFiMonitor(Context context)
034.    {
035.        m_WifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
036.        m_ConnManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
037.    }
038.     
039.    public void setOnChangeNetworkStatusListener(OnChangeNetworkStatusListener listener)
040.    {
041.        m_OnChangeNetworkStatusListener = listener;
042.    }
043. 
044.    @Override
045.    public void onReceive(Context context, Intent intent)
046.    {
047.        if (m_OnChangeNetworkStatusListener == null)
048.        {
049.            return;
050.        }
051.         
052.        String strAction = intent.getAction();
053.         
054.        if (strAction.equals(WifiManager.WIFI_STATE_CHANGED_ACTION))
055.        {
056.            switch(m_WifiManager.getWifiState())
057.            {
058.            case WifiManager.WIFI_STATE_DISABLED:
059.                m_OnChangeNetworkStatusListener.OnChanged(WIFI_STATE_DISABLED);
060.                break;
061.                 
062.            case WifiManager.WIFI_STATE_DISABLING:
063.                m_OnChangeNetworkStatusListener.OnChanged(WIFI_STATE_DISABLING);
064.                break;
065.                 
066.            case WifiManager.WIFI_STATE_ENABLED:
067.                m_OnChangeNetworkStatusListener.OnChanged(WIFI_STATE_ENABLED);
068.                break;
069.                 
070.            case WifiManager.WIFI_STATE_ENABLING:
071.                m_OnChangeNetworkStatusListener.OnChanged(WIFI_STATE_ENABLING);
072.                break;
073.                 
074.            case WifiManager.WIFI_STATE_UNKNOWN:
075.                m_OnChangeNetworkStatusListener.OnChanged(WIFI_STATE_UNKNOWN);
076.                break;
077.            }
078.        }
079.        else if (strAction.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION))
080.        {
081.            NetworkInfo networkInfo = m_ConnManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
082.            if ( (networkInfo != null) && (networkInfo.isAvailable() == true) )
083.            {
084.                if (networkInfo.getState() == NetworkInfo.State.CONNECTED)
085.                {
086.                    m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_CONNECTED);
087.                }
088.                else if (networkInfo.getState() == NetworkInfo.State.CONNECTING)
089.                {
090.                    m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_CONNECTING);
091.                }
092.                else if (networkInfo.getState() == NetworkInfo.State.DISCONNECTED)
093.                {
094.                    m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_DISCONNECTED);
095.                }
096.                else if (networkInfo.getState() == NetworkInfo.State.DISCONNECTING)
097.                {
098.                    m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_DISCONNECTING);
099.                }
100.                else if (networkInfo.getState() == NetworkInfo.State.SUSPENDED)
101.                {
102.                    m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_SUSPENDED);
103.                }
104.                else if (networkInfo.getState() == NetworkInfo.State.UNKNOWN)
105.                {
106.                    m_OnChangeNetworkStatusListener.OnChanged(NETWORK_STATE_UNKNOWN);
107.                }
108.            }
109.        }
110.    }
111.}


암튼, 대충 이런 형태의 클래스를 하나 만들어놓고, 사용하면 됩니다.

메인 Activity에서 위의 클래스를 불러와서 사용하는 예제는 다음과 같습니다.

01.package snowdeer.wifi.monitor;
02. 
03.import android.app.Activity;
04.import android.content.IntentFilter;
05.import android.net.wifi.WifiManager;
06.import android.os.Bundle;
07.import android.util.Log;
08. 
09.public class ActSnowWiFiMonitor extends Activity
10.{
11.    private SnowWiFiMonitor m_SnowWifiMonitor = null;
12.     
13.    @Override
14.    public void onCreate(Bundle savedInstanceState)
15.    {
16.        super.onCreate(savedInstanceState);
17.        setContentView(R.layout.main);
18.         
19.        m_SnowWifiMonitor = new SnowWiFiMonitor(this);
20.        m_SnowWifiMonitor.setOnChangeNetworkStatusListener(SnowChangedListener);
21.         
22.        //registerReceiver(m_SnowWifiMonitor, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
23.        registerReceiver(m_SnowWifiMonitor, new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION));
24.    }
25.     
26.    @Override
27.    protected void onDestroy()
28.    {
29.        super.onDestroy();
30.         
31.        unregisterReceiver(m_SnowWifiMonitor);
32.    }
33.     
34.    SnowWiFiMonitor.OnChangeNetworkStatusListener SnowChangedListener
35.        = new SnowWiFiMonitor.OnChangeNetworkStatusListener()
36.    {
37.        @Override
38.        public void OnChanged(int status)
39.        {
40.            switch(status)
41.            {
42.            case SnowWiFiMonitor.WIFI_STATE_DISABLED:
43.                Log.i("", "[WifiMonitor] WIFI_STATE_DISABLED");
44.                break;
45.                 
46.            case SnowWiFiMonitor.WIFI_STATE_DISABLING:
47.                Log.i("", "[WifiMonitor] WIFI_STATE_DISABLING");
48.                break;
49.                 
50.            case SnowWiFiMonitor.WIFI_STATE_ENABLED:
51.                Log.i("", "[WifiMonitor] WIFI_STATE_ENABLED");
52.                break;
53.                 
54.            case SnowWiFiMonitor.WIFI_STATE_ENABLING:
55.                Log.i("", "[WifiMonitor] WIFI_STATE_ENABLING");
56.                break;
57.                 
58.            case SnowWiFiMonitor.WIFI_STATE_UNKNOWN:
59.                Log.i("", "[WifiMonitor] WIFI_STATE_UNKNOWN");
60.                break;
61.                 
62.            case SnowWiFiMonitor.NETWORK_STATE_CONNECTED:
63.                Log.i("", "[WifiMonitor] NETWORK_STATE_CONNECTED");
64.                break;
65.                 
66.            case SnowWiFiMonitor.NETWORK_STATE_CONNECTING:
67.                Log.i("", "[WifiMonitor] NETWORK_STATE_CONNECTING");
68.                break;
69.                 
70.            case SnowWiFiMonitor.NETWORK_STATE_DISCONNECTED:
71.                Log.i("", "[WifiMonitor] NETWORK_STATE_DISCONNECTED");
72.                break;
73.                 
74.            case SnowWiFiMonitor.NETWORK_STATE_DISCONNECTING:
75.                Log.i("", "[WifiMonitor] NETWORK_STATE_DISCONNECTING");
76.                break;
77.                 
78.            case SnowWiFiMonitor.NETWORK_STATE_SUSPENDED:
79.                Log.i("", "[WifiMonitor] NETWORK_STATE_SUSPENDED");
80.                break;
81.                 
82.            case SnowWiFiMonitor.NETWORK_STATE_UNKNOWN:
83.                Log.i("", "[WifiMonitor] WIFI_STATE_DISABLED");
84.                break;
85.         
86.            }
87.        }
88.    };


앗!! 그리고 주의하셔야 할 점은 AndroidManifest.xml 파일에서 권한 설정을 미리 해둬야 한다는 점이겠죠?

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

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

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

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

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

 

  1. 감사합니다. 도움이 되는 정말 멋진 글이네요. 그리고 질문 있는데요. interface 부분 SnowWiFiMonitor 클래스에서 implement로 상속받으면서 메소드를 구현하면 안되나요?

  2. Messiah 2012/05/02 12:04  댓글주소 수정/삭제 댓글쓰기

    근데.정말 실시간으로 되는건가요? 제가 코딩을 잘못한건지 와이파이 변화를 감지못하는거 같은데요... 음...


  • Messiah 2012/05/02 15:28  댓글주소 수정/삭제 댓글쓰기

    NETWORK_STATE_CHANGED_ACTION 리시브 받으시려면 이 소스에서 조금 수정하셔야합니다.

    WifiManger 클래스에는 wifi 상태 저 5가지만 체크할수 있습니다.

    따라서 NETWORK_STATE_CHANGED_ACTION은 리시브를 제대로 받을수 없는 것이지요.

    주석처리된 registerReceiver 주석푸시고. ConnectivityManager 를 이용하여 wifi 접속 이벤트 리시브가 오는 것을

    onReceive() 메소드에서 처리 해주시면 됩니다. 저는 그렇게 소스 변경하여서 사용하였습니다.