2014-01-30 70 views
5

我需要注意android系统中的网络更改并相应地执行特定的活动。检测WiFi或移动网络

1)当无线启用时,执行功能A. 2)当启用移动网络,执行功能B. 3)当无线网络被禁用,并且移动网络被使能,停止功能A和启动功能B. 4)当移动网络被禁用且WiFi被启用时,停止功能B并启动功能A. 5)当没有网络可用时,不执行功能。

我试过使用CONNECTIVITY_CHANGE。有了这个,我多次获得了Intent,我也知道它的原因。还有另一个问题。考虑到移动网络是开启的。现在,当启用WiFi时,我启用了WiFi的2到3次,并且移动网络禁用也不会被确认。

我也试着用PhoneStateListener.LISTEN_DATA_CONNECTION_STATE注册。它几乎可以工作,但是,当WiFi和移动网络都打开时,我知道WiFi将处于活动状态,并且当我关闭WiFi时,有时会收到启用移动网络的消息,有时候我不会。

我需要解决这个问题。请帮助我的指导。

回答

0

所以实际上你有四个状态为(+第五,如果互联网是有或没有)

当网络可用时,你必须通过监控WiFi和移动网络的状态来检查互联网服务提供商,你的四状态是

无线上网的变化状态和

1.移动网络启用
2.移动网络被禁用

移动网络变化状态和

1.无线上网启用
2。禁用了WiFi,

首先你必须监控如果互联网是否可用,在这之后,你必须添加类似的两个监听器(广播recievers)建立WLAN连接状态变化和移动状态的变化和检查所需的状态下,我已经添加以下状态检查方法,

Reciever实施

检查在接收器中的变化,然后检查状态

public class Internet_State extends BroadcastReceiver { 
//checked with new state changed when event occurs 
public boolean oldInternetState; 

@Override 
public void onReceive(Context context, Intent intent) { 
    ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    Bundle b = intent.getExtras(); 
    // if Internet available 
    boolean isConnected = !b 
      .getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY); 
      // ignore if no state change 
    if (oldInternetState == isConnected) 
     return; 
    // set new oldInternetState 
    oldInternetState = isConnected; 
    boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE; 
    boolean isWifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) 
      .isAvailable(); 
//you can save these states to be monitored in wifi and mobile change change listners 

    //No internet is 0 state 
    int state = isConnected?1:0; 
      if(state) 
      state = checkState(context) 
    intent.putExtra("state", state); 
      // and then send this intent to your required method which will 
      // check the state and perform function 
} 

@Override 
public void initialize(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
      //save the current internet state at start of the receiver registration 
    oldInternetState = false; 
    if (activeNetwork != null) 
     oldInternetState = activeNetwork.isConnectedOrConnecting(); 
} 

} 

实现两个,手机和WiFi状态变化广播recievers和更好的增加状态检查方法,这样

检查国家

监控状态出的四种状态

public int checkState(Context context){ 
      ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
     boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE; 
    boolean isWifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) 
      .isAvailable(); 
    //No internet is 0 state 
    int state = isConnected?1:0; 
    if(isWifi && isMobile) 
     state = 1; 
    else if(isWifi && !isMobile) 
     state = 2; 
    if(isMobile && isWifi) 
     state = 3; 
    else if(isMobile && !isWifi) 
     state = 4; 
     return state; 
} 

并从3个Wifi,Internet和Mobile调用此方法数据更改接收者,不要忘记检查oldState并将其与状态更改相匹配。建立WLAN连接状态

移动老态的

NetworkInfo allNetInfo = cm 
      .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
    oldDataState = allNetInfo.getState(); 

int state = intent.getExtras().getInt(WifiManager.EXTRA_WIFI_STATE); 
    if (state == WifiManager.WIFI_STATE_ENABLED) 
     state = 1; 
    else if (state == WifiManager.WIFI_STATE_DISABLED) 
     state = 0; 
    else 
     return; 
    if (state == oldWifiState) 
     return; 
    oldWifiState = state; 

问题,我得到的支持WiFi 2〜3倍

WIFI的一个以上的电话改变发生,因为Wifi改变状态,如TurningOn和TurningOf由OS触发,你必须消除他们,就像我上面不喜欢

if (state == WifiManager.WIFI_STATE_ENABLED) 
     state = 1; 
    else if (state == WifiManager.WIFI_STATE_DISABLED) 
     state = 0; 
    else 
     return; 

只有Enabled和Disabled现在被监控。

0

您可以尝试注册广播接收器以注意网络更改。参见:http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html

要小心,国家可以改变太多次,每次你的广播将被触发。

+0

这就是我的问题。如何用一个触发器注意到这些变化?此外,该技术同时启用移动网络和WiFi,当我们启用它们时。其实,WiFi将会很活跃。当WiFi开启时,我们将不得不动态地决定移动网络已关闭。 – madhu

1
Please find the below code. I suppose it is what you want. In case I misunderstood you, then please let me know: 


    public void checkWifiMobileNetwork(Context context){ 

      ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo(); 

      if (activeNetwork != null && activeNetwork.isConnected()) { 
       android.net.NetworkInfo connWifiType = conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
       android.net.NetworkInfo connMobileType = conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

       if(connWifiType.isConnectedOrConnecting()){ 
        Log.d("NETWORK_STATUS","WIFI_IS_THERE"); 
       }else{ 
        Log.d("NETWORK_STATUS","WIFI_IS_NOT_THERE"); 
       } 

       if(connMobileType.isConnectedOrConnecting()){ 
        Log.d("NETWORK_STATUS","MOBILE_NETWORK_IS_THERE"); 
       }else{ 
        Log.d("NETWORK_STATUS","MOBILE_NETWORK_IS_NOT_THERE"); 
       } 

      }else { 
       //notify user you are not online 
       Log.d("NETWORK_STATUS","WIFI_MOBILE_IS_NOT_THERE"); 

      } 
     } 

Set permission at Manifest: 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
0

在应用程序中的第一个活动中尝试此代码。

public class YourActivity extends Activity { 

    Context mContext; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mContext = this; 
     this.registerReceiver(this.mNetworkConReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); // Here you register your receiver 
    } 

    private BroadcastReceiver mNetworkConReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      ConnectivityManager conMngr = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
      NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

      if(wifi.isConnected()){ 
       // Wifi is connected 
      }else if(mobile.isConnected() && wifi.isConnected()){ 
       // Mobile Network and Wifi is connected 
      }// Others conditions here... 

     } 
    }; 

} 

记住:由Android每次网络状态变化来触发你的广播接收器will'be。