2012-05-24 3 views
27

휴대 전화가 Wi-Fi에 연결될 때마다 데이터베이스를 업데이트하는 앱을 개발하기 시작했습니다. 나는 ServiceBroadcastReceiver을 구현했는데 Service (어떤 네트워크가 사용 중인지 알려주 겠지만) 문제는 내가 네트워크 매니페스트 파일을 추가하기 위해 무엇을 추가해야할지 모르겠다. BroadcastReceiver 네트워크 상태가 변경되거나 어떤 종류의 네트워크에 연결합니다.wifi 또는 3g 네트워크 상태가 변경된 경우 BroadcastReceiver

감사합니다.

답변

57

당신은 당신의 수신기 태그에서

<intent-filter> 
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/> 
<action android:name="android.net.wifi.STATE_CHANGE"/> 
</intent-filter> 

을 할 것입니다.

또는 등록 브로드 캐스트 리시버는 이러한 설정하기 전에 당신이 그것을보다 효율적으로 제어하려는 경우 :

final IntentFilter filters = new IntentFilter(); 
filters.addAction("android.net.wifi.WIFI_STATE_CHANGED"); 
filters.addAction("android.net.wifi.STATE_CHANGE"); 
super.registerReceiver(yourReceiver, filters); 

WIFI_STATE_CHANGED

와이파이가 가능, 장애인 활성화되었음을 알리는 방송 의도 액션, 사용 중지 또는 알 수 없음 하나의 여분은이 상태를 int로 제공합니다. 가능한 경우 이전 상태를 제공합니다.

STATE_CHANGE

방송 무선 인터넷 접속의 상태가 변경된 것을 나타내는 액션 의도. 하나의 여분은 NetworkInfo 객체의 형태로 새로운 상태를 제공합니다. 새로운 상태가 CONNECTED (연결됨)이면 추가 엑스트라가 액세스 포인트의 BSSID 및 WifiInfo를 제공 할 수 있습니다.

또한 String로서, 당신은 "매니페스트"태그 내에 올바른 권한을 지정해야합니다 :

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

이 연결을 확인하려면 사용할 수있는 연결의 유형을 알려줍니다 당신은 ConnectivityManager를 사용할 수 있습니다.

ConnectivityManager conMngr = (ConnectivityManager)this.getSystemService(this.CONNECTIVITY_SERVICE); 
android.net.NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
android.net.NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
+1

링크? – tasomaniac

+0

조금 더 정확해질 수 있겠습니까 ... – nullpotent

+2

나는 이것이 WIFI 어댑터의 연결 변경만을 제공한다고 생각합니다. 모바일 데이터 연결이 변경되면 알림을 받고 싶습니다. 감사합니다 iccthedral. – tasomaniac

5

이 내가 연결이 변경 될 때 알림을받을하기 위해 할 것입니다. 브로드 캐스트를 수신하도록 BroadCastReceiver를 정의합니다.

public class NetworkChangeReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
     NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

     boolean isConnected = wifi != null && wifi.isConnectedOrConnecting() || 
      mobile != null && mobile.isConnectedOrConnecting(); 
     if (isConnected) { 
      Log.d("Network Available ", "YES"); 
     } else { 
      Log.d("Network Available ", "NO"); 
     } 
    } 
} 

는 또한 ConnectivityChange에 의한 매니페스트에서 방송 및 필터를 정의해야합니다.

<receiver android:name=".NetworkChangeReceiver" > 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     </intent-filter> 
</receiver> 

소스 here

+0

안드로이드 N으로 시작하여'android.net.conn.CONNECTIVITY_CHANGE "브로드 캐스트는 더 이상 사용되지 않습니다. 문서는'JobScheduler' 또는'GCMNetworkManager'를 사용하도록 제안합니다 –

+1

@Nicholas 그것은 방송을 만들어야합니다. 수신자는 매니페스트 파일이 아니라 코드 내에 있어야합니다. –

0

는 Dantalian의 대답 @ 보완합니다. Android Nougat부터는 CONNECTIVITY_ACTION 브로드 캐스트를 수신하지 않기 때문에 Manifest에 리시버를 선언하면 안됩니다. 대신 Context.registerReceiver(Receiver, Intent) 메소드를 사용하여 수신기를 등록해야합니다.우리는 또한 데이터 연결을 확인하기 위해 방송 수신기를 추가 할 수 소스 here

관련 문제